使用替代方法计算sha256而不使用已弃用的openssl代码

5

/usr/include/openssl/sha.h 中声明的 SHA256_XXX 系列已在 OS-X 10.7 及以上版本中被弃用。

int SHA256_Init(SHA256_CTX *c) DEPRECATED_IN_MAC_OS_X_VERSION_10_7_AND_LATER;
int SHA256_Update(SHA256_CTX *c, const void *data, size_t len) DEPRECATED_IN_MAC_OS_X_VERSION_10_7_AND_LATER;
int SHA256_Final(unsigned char *md, SHA256_CTX *c) DEPRECATED_IN_MAC_OS_X_VERSION_10_7_AND_LATER;
unsigned char *SHA256(const unsigned char *d, size_t n,unsigned char *md) DEPRECATED_IN_MAC_OS_X_VERSION_10_7_AND_LATER;
void SHA256_Transform(SHA256_CTX *c, const unsigned char *data) DEPRECATED_IN_MAC_OS_X_VERSION_10_7_AND_LATER;

虽然目前它可以工作,但我想知道有没有更适合后续OS X版本的替代方案。


一个可能性是,在我的项目中,我正在构建和交付自己的OpenSSL库或嵌入式框架到应用程序中... - Michael Dautermann
@MichaelDautermann,你的意思是什么?你是自己编译 OpenSSL(没有弃用声明)并使用它吗? - Zohar81
是的,我会构建自己的 OpenSSL 版本,并链接到它,而不是使用苹果 SDK 中内置的版本,因为苹果建议我们不要使用它。参考链接 - Michael Dautermann
2个回答

9

目前所有摘要的批准技术是通过EVP完成的。

https://www.openssl.org/docs/manmaster/crypto/EVP_DigestInit.html#EXAMPLE

SHA256的示例函数(来自https://wiki.openssl.org/index.php/EVP_Message_Digests)。

void digest_message(unsigned char *message, unsigned char **digest, unsigned int *digest_len)
{
    EVP_MD_CTX *mdctx;

    if((mdctx = EVP_MD_CTX_new()) == NULL)
        handleErrors();

    if(1 != EVP_DigestInit_ex(mdctx, EVP_sha256(), NULL))
        handleErrors();

    if(1 != EVP_DigestUpdate(mdctx, message, strlen(message)))
        handleErrors();

    if((*digest = (unsigned char *)OPENSSL_malloc(EVP_MD_size(EVP_sha256()))) == NULL)
        handleErrors();

    if(1 != EVP_DigestFinal_ex(mdctx, *digest, digest_len))
        handleErrors();

    EVP_MD_CTX_free(mdctx);
}

1
这篇文章所述内容是很好的,也是最新的。我使用EVP_MD_CTX_newEVP_MD_CTX_free代替你使用的createdelete版本。它们之间有什么区别?为什么我要选择其中一个? - wcochran
@wcochran 根据文档,没有区别。在OpenSSL 1.1.0中,EVP_MD_CTX_create()和EVP_MD_CTX_destroy()函数被重命名为EVP_MD_CTX_new()和EVP_MD_CTX_free()。因此,可以安全地假设在使用新的OpenSSL版本时,应该像你一样使用“_free”和“_new”。我会更新我的答案。谢谢! - Leśny Rumcajs

2

Common Crypto支持SHA256和其他加密方法,并可用于OS X和iOS。添加Security.framework并包含<CommonCrypto/CommonDigest.h>。 Common Crypto是一个“C” API。


你能告诉我在security.framework中寻找哪个头文件用于进行SHA256计算吗? - Zohar81
糟糕,答案中包含了该信息,但没有正确引用,因此未能显示。已修复。具体而言,它位于<CommonCrypto/CommonDigest.h>中。 - zaph

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接