Sign、DigestSign 和 Digest 之间有什么区别?
What is the difference between Sign, DigestSign, and Digest?
我正在实施散列(也称为摘要)并登录一个使用 OpenSSL EVP API 的应用程序。然而 API 有三个非常相似的方法,令人困惑:
Sign
听起来应该用于签名,但是 EVP_SignInit
只是 #define
到 EVP_DigestInit
Digest
似乎只能用于哈希生成,无法指定 EVP_PKEY
.
DigestSign
看起来它同时进行了散列和签名。
但是 the documentation 建议使用 DigestSign
进行签名(而不是实际的 Sign
)。
我不是密码学专家,所以这让我很困惑。它们之间有什么区别?哪个是实现签名的好选择?
可在 EVP_SignInit
的文档中找到以下内容:
Since the private key is passed in the call to EVP_SignFinal()
any error relating to the private key (for example an unsuitable key and digest combination) will not be indicated until after potentially large amounts of data have been passed through EVP_SignUpdate()
.
It is not possible to change the signing parameters using these function.
The previous two bugs are fixed in the newer EVP_SignDigest()
function.
注意:我逐字复制了这个,函数被称为 EVP_DigestSign
而不是 EVP_SignDigest
。
所以是对之前API无法修正的两个bug的替换函数。当然,您希望旧的 API 存在并以相同的方式运行以实现向后兼容性。
所以旧的 API 没有遵守 fail fast 或 least surprise 的原则;你不想在对消息进行哈希处理后崩溃,因为使用了错误的方案:要使用的方案通常是预先建立的 .
我正在实施散列(也称为摘要)并登录一个使用 OpenSSL EVP API 的应用程序。然而 API 有三个非常相似的方法,令人困惑:
Sign
听起来应该用于签名,但是EVP_SignInit
只是#define
到EVP_DigestInit
Digest
似乎只能用于哈希生成,无法指定EVP_PKEY
.DigestSign
看起来它同时进行了散列和签名。
但是 the documentation 建议使用 DigestSign
进行签名(而不是实际的 Sign
)。
我不是密码学专家,所以这让我很困惑。它们之间有什么区别?哪个是实现签名的好选择?
可在 EVP_SignInit
的文档中找到以下内容:
Since the private key is passed in the call to
EVP_SignFinal()
any error relating to the private key (for example an unsuitable key and digest combination) will not be indicated until after potentially large amounts of data have been passed throughEVP_SignUpdate()
.It is not possible to change the signing parameters using these function.
The previous two bugs are fixed in the newer
EVP_SignDigest()
function.
注意:我逐字复制了这个,函数被称为 EVP_DigestSign
而不是 EVP_SignDigest
。
所以是对之前API无法修正的两个bug的替换函数。当然,您希望旧的 API 存在并以相同的方式运行以实现向后兼容性。
所以旧的 API 没有遵守 fail fast 或 least surprise 的原则;你不想在对消息进行哈希处理后崩溃,因为使用了错误的方案:要使用的方案通常是预先建立的 .