【问题标题】:What is the difference between the different padding types on iOS?iOS上不同的填充类型有什么区别?
【发布时间】:2011-06-30 13:19:51
【问题描述】:

在 iOS 上,Certificate, Key, and Trust Services API 包含以下填充类型:

  • kSecPaddingNone
  • kSecPaddingPKCS1
  • kSecPaddingPKCS1MD2
  • kSecPaddingPKCS1MD5
  • kSecPaddingPKCS1SHA1

Apple CDSA mailing list 上的用户说“kSecPaddingPKCS1 [...] 与 PKCS #1 1.5 相同”。证书、密钥和信任服务参考将后三种填充类型(kSecPaddingPKCS1MD2kSecPaddingPKCS1MD5kSecPaddingPKCS1SAH)注释为“将完成标准 ASN.1 填充,以及基础 RSA 操作的 PKCS1 填充”。

  1. kSecPaddingPKCS1 有什么区别?
  2. kSecPaddingPKCS1 只是根据 RFC 3447 对基础 RSA 操作的原始填充吗?
  3. 使用SecKeyRawSign() 签署SHA-256、SHA-384 或SHA-512 摘要时,开发人员是否需要使用kSecPaddingPKCS1 并自己执行ASN.1 填充? ASN.1 填充是必需的还是可以省略?

非常感谢任何指出我正确方向的提示。

【问题讨论】:

    标签: iphone security ios encryption digital-signature


    【解决方案1】:

    PKCS#1 包含两个用于 RSA 签名的“填充”,“新”一个(称为 PSS,在 2.1 版中添加)和“旧”一个(重命名为“v1.5”,因为它已经在 1.5 版中PKCS#1)。我们正在讨论 v1.5 填充。

    当对某些数据进行签名时,首先使用合适的哈希函数(例如 SHA-1)对其进行哈希处理,然后将哈希值(如果使用 SHA-1,则为 20 个字节)包装成两个连续的层:

    1. 哈希值被编码为基于 ASN.1 的结构,该结构还指定使用了哪个哈希函数。在实践中,如果散列值是H,那么第一次包装的结果是字节序列A || H 其中“||”是连接,“A”是特定于哈希函数的标头(通常为 15 到 20 个字节)。

    2. A || H”扩展了一些额外的字节:

    0x00 0x01 0xFF 0xFF ... 0xFF 0x00 ||一个 ||呵呵

    0xFF 的字节数调整为总大小等于 RSA 模数的大小(即 1024 位 RSA 密钥为 128 个字节)。

    第二步是 PKCS#1 所说的“类型 1 填充”。

    kSecPaddingPKCS1 表示该函数只执行第二步:它假设输入数据已经是正确的“A || H”。请注意,SSL/TLS(最高版本 1.1)使用需要此模式的签名变体(没有“A”,但有两个哈希函数)。使用kSecPaddingPKCS1SHA1,签名函数期望哈希值作为输入,并添加“A”标头本身。

    对于可以由第三方实现验证的正确、符合标准的签名,必须在某些时候添加“A”标头。可以自己添加,使用kSecPaddingPKCS1,也可以使用kSecpaddingPKCS1SHA1,让引擎自己添加,这样可能更不容易出错。

    (截至 2011 年,不建议使用 SHA-1;您最好切换到 SHA-256 或 SHA-512。此外,您尝试使用的 API 似乎非常低级,并且整个事情看起来很可疑,好像您要实现自己的加密协议,而不是使用现有的库或框架。)

    【讨论】:

    • 感谢您的出色回答!我知道这是相当低级的。我正在写关于 iOS 应用程序安全性的毕业论文,需要更深入地研究安全 API。我没有实现我自己的加密协议。回顾一下,为了使用例如SHA-512 我将计算摘要 H 并将其与来自 PKCS#1:SHA-512: (0x)30 51 30 0d 06 09 60 86 48 01 65 03 04 02 03 05 00 04 40 || H 的标头连接。结果与kSecPaddingPKCS1 一起是SecKeyRawSign() 的输入。对吗?
    • 很酷,那么我的问题已经完全回答了。
    • “截至 2011 年,不建议使用 SHA-1”您能否链接一篇文章来支持/解释这一点?
    • @lhunath:例如参见NIST special publication 800-107,尤其是关于:“SHA-1 不应用于任何需要至少 80 位安全性的新数字签名应用程序。此外,SHA-1 -1 不得用于 2010 年底之后的任何数字签名应用程序”。 SHA-1 在抗碰撞方面存在(但理论上的)弱点,因此在新应用程序中正式不鼓励使用它(为了与旧应用程序的互操作性,它仍然是“批准”,用 NIST 的说法)。
    • 如何使用 SecPadding.PKCS8,因为 IOS 不支持??!!
    猜你喜欢
    • 1970-01-01
    • 2011-02-18
    • 2015-11-10
    • 2011-01-21
    • 2010-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-26
    相关资源
    最近更新 更多