用Java生成X509Certificate的主题哈希

用Java生成X509Certificate的主题哈希,第1张

用Java生成X509Certificate的主题哈希

这将生成一个短的8位数字哈希1817886a

OpenSSL有两种形式:

$ cd openssl-1.0.2-src$ grep -R X509_subject_name_hash *...crypto/x509/x509.h:unsigned long X509_subject_name_hash(X509 *x);crypto/x509/x509.h:unsigned long X509_subject_name_hash_old(X509 *x);crypto/x509/x509_cmp.c:unsigned long X509_subject_name_hash(X509 *x)crypto/x509/x509_cmp.c:unsigned long X509_subject_name_hash_old(X509 *x)...

在Java中生成X509Certificate的主题哈希…

这是他们的来源

crypto/x509/x509_cmp.c

unsigned long X509_subject_name_hash(X509 *x){    return (X509_NAME_hash(x->cert_info->subject));}#ifndef OPENSSL_NO_MD5unsigned long X509_subject_name_hash_old(X509 *x){    return (X509_NAME_hash_old(x->cert_info->subject));}#endif

最后:

unsigned long X509_NAME_hash(X509_NAME *x){    unsigned long ret = 0;    unsigned char md[SHA_DIGEST_LENGTH];        i2d_X509_NAME(x, NULL);    if (!EVP_Digest(x->canon_enc, x->canon_enclen, md, NULL, EVP_sha1(),         NULL))        return 0;    ret = (((unsigned long)md[0]) | ((unsigned long)md[1] << 8L) |((unsigned long)md[2] << 16L) | ((unsigned long)md[3] << 24L)        ) & 0xffffffffL;    return (ret);}#ifndef OPENSSL_NO_MD5unsigned long X509_NAME_hash_old(X509_NAME *x){    EVP_MD_CTX md_ctx;    unsigned long ret = 0;    unsigned char md[16];        i2d_X509_NAME(x, NULL);    EVP_MD_CTX_init(&md_ctx);    EVP_MD_CTX_set_flags(&md_ctx, EVP_MD_CTX_FLAG_NON_FIPS_ALLOW);    if (EVP_DigestInit_ex(&md_ctx, EVP_md5(), NULL)        && EVP_DigestUpdate(&md_ctx, x->bytes->data, x->bytes->length)        && EVP_DigestFinal_ex(&md_ctx, md, NULL))        ret = (((unsigned long)md[0]) | ((unsigned long)md[1] << 8L) |    ((unsigned long)md[2] << 16L) | ((unsigned long)md[3] << 24L) ) & 0xffffffffL;    EVP_MD_CTX_cleanup(&md_ctx);    return (ret);}#endif

i2d_X509_NAME
X509_NAME
使用RFC
2459
(及其他地方)将a编码为标准表示形式。例如,它用于证书主题和颁发者名称。

您可以使用类似的命令查看OpenSSL用于名称字符串的内容

openssl x509 -in <cert> -text-noout
。它看起来类似于
C=US, ST=California, L=Mountain View, O=Google Inc,CN=www.google.com
(取自Google证书)。


在Java中生成X509Certificate的主题哈希…

在大图中,您正在生成主题的专有名称字符串的哈希,并返回一个无符号的long。unsigned long实际上是一个截断的哈希。

X509_subject_name_hash
使用SHA-1,并
X509_subject_name_hash_old
使用MD5。


(评论)…他们如何使用sha1哈希生成该短哈希

OpenSSL提供了截断的哈希的十六进制编码。整个哈希在中

md
md
将为16个字节(MD5)或20个字节(SHA-1)。

截断与字节选择发生

[0,3]
和对位 *** 作
md[0]
md[1]
md[2]
md[3]

8位数字来自对4个字节进行十六进制编码。



欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/5487797.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-12-12
下一篇2022-12-13

发表评论

登录后才能评论

评论列表(0条)

    保存