【问题标题】:Calculating SHA256 hash with OpenSSL in FIPS mode在 FIPS 模式下使用 OpenSSL 计算 SHA256 哈希
【发布时间】:2016-04-11 15:07:52
【问题描述】:

背景
我已经使用 OpenSSL FIPS 对象模块编译了 OpenSSL(按照交叉编译到 Android 的说明)。

现在我想在我的代码中使用 SHA256(据我所知,至少有一些 sha256 算法是 FIPS 批准的)。

问题
在运行时调用 set_mode(1) 启用 FIPS 后,以下代码在 OpenSSLDie 中崩溃(大概意思是被 FIPS 禁用)

SHA256_CTX sha256;
SHA256_Init(&sha256);
SHA256_Update(&sha256, data, len);
SHA256_Final(outputBuffer, &sha256);

问题

  1. 似乎调用private_SHA256_Init 可以代替,但这是正确的方法还是规避了 FIPS 合规性? 如果这不是正确的方法,我该如何在 FIPS 模式下计算 SHA256?

  2. 由于如果不用于加密(由 FIPS-140.2)允许使用未经批准的算法,那么调用私有函数会很好(例如计算 SHA1,这在FIPS 模式,但不能用于加密)

更多信息
使用的版本:openssl-1.0.1q、openssl-fips-2.0.11

【问题讨论】:

    标签: openssl sha256 fips


    【解决方案1】:

    据我所知,不推荐使用 SHA256_Init 等低级函数。

    目前批准的使用 OpenSSL 计算摘要的方法是通过 EVP。 SHA-256 的示例,取自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_create()) == 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_destroy(mdctx);
    }
    

    【讨论】:

      猜你喜欢
      • 2011-12-12
      • 2014-01-14
      • 1970-01-01
      • 2016-07-27
      • 2016-08-03
      • 1970-01-01
      • 2013-07-25
      • 2012-03-28
      • 1970-01-01
      相关资源
      最近更新 更多