我正在实施散列(aka。摘要)并在使用OpenSSL EVP API的应用中登录。然而,API有三种非常相似的方法,这些方法令人困惑:
Sign
听起来应该用于签名,但EVP_SignInit
只是#define
到EVP_DigestInit
Digest
似乎只能用于哈希生成,无法指定EVP_PKEY
。DigestSign
看起来像哈希和签名一样。但the documentation建议您使用DigestSign
进行签名(而不是实际的Sign
)。
我不是加密专家,所以这对我来说非常困惑。他们之间有什么区别?哪一个是实施签名的好选择?
答案 0 :(得分:1)
以下内容可在EVP_SignInit
的文档中找到:
由于私钥在
EVP_SignFinal()
的调用中传递,因此在通过潜在的大量数据后才会显示与私钥相关的任何错误(例如,不合适的密钥和摘要组合)。EVP_SignUpdate()
。无法使用这些功能更改签名参数。
前两个错误已在较新的
EVP_SignDigest()
函数中修复。
注意:我逐字复制,函数称为EVP_DigestSign
而不是EVP_SignDigest
。
因此它是两个错误的替换函数,无法通过以前的API进行修改。当然,您希望使用旧的API,并且向后兼容性的行为方式相同。
因此,旧API不符合快速失败或最少惊喜的原则;您不希望在散列消息后崩溃,因为使用了错误的方案:要使用的方案通常是预先建立的。