嗨,我有文件数据(xml格式)和文件签名(ASN1 DER),还有证书(x509asn1 DER)。我想检查文件数据是否正确,但我有一些问题。我在做什么:
主要思想:一些公司A创建文件数据,然后使用SHA1获取文件数据的散列,并使用RSA私钥加密该散列并获取文件签名。然后A公司发给我文件数据和文件签名和证书。我从证书获取公钥get file_signature并使用公钥解密file_signature并获取hash_1。然后我得到文件数据并使用SHA1得到hash 2。如果hash_1和hash_2相等,我可以信任文件数据的内容,对吗?
实施:
加载证书:d2i_X509_fp()
函数。现在我有证书了。
获取证书的公钥:X509_extract_key
,现在我有公钥。
现在我想加载file_signature来使用公钥解密它,但是file_signature有ASN1 DER格式我如何加载它,我应该使用OpenSSl中的什么函数?
假设我读了文件签名,现在我必须用我的公钥解密它,是否有用于此目的的API?
假设我解密文件签名并得到哈希1。
现在我必须加载文件数据并使用SHA1函数hash 2获取它的散列,我必须使用什么函数?SHA1()
或SHA1_Init, SHA1_Update, SHA1_Finish
?
假设我得到hash_1和hash_2,我必须如何使用memcmp
比较它们?
假设我比较它们,如果它们相等,我可以使用文件数据。
另一个问题是,文件签名是128字节的len,当我解密它时,我得到128字节的hash_1(我是否正确),但当我得到文件数据hash_2的hash时,它的长度只有20字节,所以我如何比较它们,或者我误解了什么?
谢谢你的帮助!
对不起我的英语;)。
最佳答案
如果你得到一个128字节的文件签名,那么它可能不是ASN.1编码的。128位正好是1024位密钥的密钥长度(现在在低端,请查看key length.com)。如果使用RSA,散列不会直接加密:首先它被包装在ASN.1结构中,然后它被填充,这都是根据PKCS#1v1.5(Google it)进行的。
通常情况下,您不会单独执行散列和RSA加密。像openssl这样的库将包含执行验证的函数,其中哈希是自动计算的(毫无疑问,这将是openssl_verify())。这些函数也将为您进行比较。
请注意,您需要建立对公钥的信任,否则攻击者只会生成一个随机密钥对,并将其他公钥与攻击者签名的数据一起发送给您。通常,公钥是通过事先直接通信或使用PKI基础设施(证书链)来信任的。