Openssl 符号、摘要符号和摘要符号之间的区别是什么?

Openssl 符号、摘要符号和摘要符号之间的区别是什么?,openssl,cryptography,sign,evp-cipher,Openssl,Cryptography,Sign,Evp Cipher,我正在一个使用OpenSSL EVP API的应用程序中实现哈希(aka.digest)和签名。然而,API有三种非常相似的方法,它们令人困惑: 听起来它应该用于签名,但是EVP\u SignInit只是\define到EVP\u DigestInit 它似乎只能用于哈希生成,无法指定EVP\u PKEY 看起来它同时做散列和签名 但建议使用DigestSign进行签名(而不是实际的签名) 我不是密码专家,所以这让我很困惑。他们之间有什么区别?哪一个是实施签名的好选择?以下内容可在执行副总裁

我正在一个使用OpenSSL EVP API的应用程序中实现哈希(aka.digest)和签名。然而,API有三种非常相似的方法,它们令人困惑:

  • 听起来它应该用于签名,但是
    EVP\u SignInit
    只是
    \define
    EVP\u DigestInit
  • 它似乎只能用于哈希生成,无法指定
    EVP\u PKEY
  • 看起来它同时做散列和签名
但建议使用
DigestSign
进行签名(而不是实际的
签名


我不是密码专家,所以这让我很困惑。他们之间有什么区别?哪一个是实施签名的好选择?

以下内容可在
执行副总裁签名的文档中找到:

由于私钥是在调用
EVP\u SignFinal()
时传递的,因此在通过
EVP\u SignUpdate()
传递了大量数据之后,才会指示与私钥相关的任何错误(例如,不合适的密钥和摘要组合)

无法使用这些函数更改签名参数

较新的
EVP\u SignDigest()
函数修复了前两个错误

注意:我逐字复制了这个函数,函数名为
EVP\u DigestSign
而不是
EVP\u digest

因此,它是两个bug的替换函数,这两个bug不能被以前的API修改。当然,您希望有旧的API,并以相同的方式实现向后兼容性


因此,旧的API没有坚持快速失败或最少意外的原则;您不希望在对消息进行哈希处理后崩溃,因为使用了错误的方案:要使用的方案通常是事先建立的。

因此,如果我理解正确,
DigestSign
是新的API吗?没有
SignDigest
。是的。很抱歉,我错了,但我没有做到,我是逐字复制的。还有一个问题:
DigestSign
到底做什么?先计算一份摘要,然后签字?或者…?是的,这是签名生成的一般顺序。用另一种方法来做会很棘手,对吗?不先散列就可以签名吗?