iOS上不同的填充类型之间有什么区别?

发布于 2021-01-30 16:07:26

在iOS上,证书,密钥和信任服务API包含以下填充类型:

kSecPaddingNone
kSecPaddingPKCS1
kSecPaddingPKCS1MD2
kSecPaddingPKCS1MD5
kSecPaddingPKCS1SHA1

苹果CDSA邮件列表上的用户说“ kSecPaddingPKCS1与PKCS#1 1.5相同”。证书,密钥和信任服务参考使用“将完成标准ASN.1填充以及基础RSA操作的PKCS1填充”来注释后三种填充类型(kSecPaddingPKCS1MD2,kSecPaddingPKCS1MD5和kSecPaddingPKCS1SAH)

有什么区别kSecPaddingPKCS1?
是kSecPaddingPKCS1仅仅根据RFC 3447的基本RSA运算的原料填充?
使用签署SHA-256,SHA-384或SHA-512摘要时SecKeyRawSign(),开发人员是否需要自己使用kSecPaddingPKCS1和执行ASN.1填充?ASN.1填充是必需的还是可以省略?
任何指向我正确方向的提示都将受到高度赞赏。

关注者
0
被浏览
250
1 个回答
  • 面试哥
    面试哥 2021-01-30
    为面试而生,有面试问题,就找面试哥。

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

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

    哈希值被编码到基于ASN.1的结构中,该结构还指定使用哪个哈希函数。实际上,如果哈希值是H,则第一个换行将导致字节序列A ||。H,其中| |是连接,而“ A ”是特定于哈希函数的标头(通常为15到20个字节)。

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

    0x00 0x01 0xFF 0xFF … 0xFF 0x00 || A || H

    将值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似乎是低级的,整个事情都令人怀疑。似乎您想实现自己的加密协议,而不是使用现有的库或框架。)



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看