1

在我们的项目中,我们使用以下 OpenSSL 函数创建 SHA1 哈希,

SHA_CTX ctx;
SHA1_Init (&ctx);
SHA1_Update (&ctx, value, size);
SHA1_Final (returned_hash, &ctx);

我们正在使用一个密钥,并且多次调用 SHA1_Update。

我必须使用 Java 验证该哈希。我写了以下功能,

public static Mac hmacSha1Init(String key) {
        Mac mac = null;
        try {
            // Get an hmac_sha1 key from the raw key bytes
            byte[] keyBytes = key.getBytes();
            SecretKeySpec signingKey = new SecretKeySpec(keyBytes, "HmacSHA1");

            // Get an hmac_sha1 Mac instance and initialize with the signing key
            mac = Mac.getInstance("HmacSHA1");
            mac.init(signingKey);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        return mac;
    }

    public static Mac hmacSha1Update(String value, Mac mac) {
        try {
            // update hmac with value
            mac.update(value.getBytes());
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
        return mac;
    }

    public static String hmacSha1Final( Mac mac) {
        try {
            // Compute the hmac on input data bytes
            byte[] rawHmac = mac.doFinal();
            return Base64.encodeBase64String(rawHmac);


        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

我正在使用带有密钥的 hmacSha1Init 并使用 Mac 多次更新,最后使用 mac 调用 hmacSha1Final。

前任。

Mac mac =  hmacSha1Init("ssdsdsdioj298932276302392pdsdsfsdfs");


mac = hmacSha1Update("value1", mac);
mac = hmacSha1Update("value2", mac);
mac = hmacSha1Update("value3"', mac);
String hash =  hmacSha1Final(mac);

但我没有得到通过 OpenSSL 生成的相同 SHA1 哈希值。网络上的文档非常有限。有人可以指导我吗

4

1 回答 1

1

两个哈希值不同的原因是openssl SHA1算法中使用的输入与Java框架中使用的不同。如果你使用 MD5 算法,你会看到结果是一样的。在这种情况下,openssl 使用相同的方法。

有什么变化?好吧,openssl 认为 SHA1 不够安全,很好,所以他们决定再转一圈。通常(MD5 和 Java 框架),获取输入字符串并为其生成 ASN1 DER 编码。然后他们接受它并将其传递给算法。对于 SHA1,openssl 在生成 ASN1 DER 编码之前进行了规范化。它正在计算输入的 CANONICAL 格式,然后生成 ASN1 DER,然后将其传递给算法。

您必须修改 Java 框架才能获得相同的结果。我也在尝试自己做:)

在这里,您可以在 openssl 分发列表中找到有关它的帖子:http: //openssl.6102.n7.nabble.com/The-new-subject-hash-algorithm-td44844.html

这里是 ICM Uniwersytet Warszawski 的一个实现。不确定它有多可靠,这就是我尝试自己的原因。

https://github.com/eu-emi/canl-java/blob/master/src/main/java/eu/emi/security/authn/x509/helpers/trust/OpensslTruststoreHelper.java

于 2013-10-11T22:45:57.070 回答