iphone - iOS 上不同的填充类型有什么区别?

标签 iphone security ios encryption digital-signature

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

  • kSecPaddingNone
  • kSecPaddingPKCS1
  • kSecPaddingPKCS1MD2
  • kSecPaddingPKCS1MD5
  • kSecPaddingPKCS1SHA1

Apple CDSA mailing list 上的用户表示“kSecPaddingPKCS1 [...] 与 PKCS #1 1.5 相同”。证书、 key 和信任服务引用用“标准 ASN.1将完成填充,以及底层 RSA 操作的 PKCS1 填充”。

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

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

最佳答案

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

当一些数据被签名时,首先使用合适的散列函数(例如 SHA-1)对其进行散列,然后将散列值(如果使用 SHA-1 则为 20 字节)包装到两个连续的层中:

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

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

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

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

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

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

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

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

关于iphone - iOS 上不同的填充类型有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5054036/

相关文章:

ios - 是否可以启用/禁用 'Application does not run in background' ?

Web API 的安全性

javascript - Android 和 iOS Webview 中 html 和 javascript 文件的安全性

ios - 在 iOS 上使用 AVAudioPlayer 播放静音的最佳方式

android - 如何使用 Corona SDK 在单个页面上加载超过 32 种声音

iOS, subview 大小无故改变

ios - 在 iPhone 应用程序中安全地存储远程数据库凭据

ios - 如何使用 NSUserDefault 将选定的 TableViewCell 文本发送到之前的 ViewController

iphone - 核心数据addObject一对多关系

php - 是否可以通过 cpanel 配置和 php 脚本来防止 DDos 攻击?