Sign、DigestSign 和 Digest 之间有什么区别?

What is the difference between Sign, DigestSign, and Digest?

我正在实施散列(也称为摘要)并登录一个使用 OpenSSL EVP API 的应用程序。然而 API 有三个非常相似的方法,令人困惑:

但是 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 fastleast surprise 的原则;你不想在对消息进行哈希处理后崩溃,因为使用了错误的方案:要使用的方案通常是预先建立的 .