栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

用Java生成X509Certificate的主题哈希

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

用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个字节进行十六进制编码。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/495675.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号