CSP:使用CryptoAPI获取X509证书的HASH(指纹)值

请关注之前的系列文章

使用CryptoAPI解码X509证书内容
使用CryptoAPI解析X509证书基本项

       通过之前的文章,我们可以使用CryptoAPI解码X509证书文件,并且解析证书的基本项,这次我们尝试通过CryptoAPI获取证书的HASH值。证书的HASH值,也称指纹值,是检查证书的完整性、正确性的属性。如果使用父证书来验证证书的签名时,就会使用到HASH值。
       通过Windows查看证书的方式看到的证书HASH(指纹)值如下:


      有了前面系列文章的基础,我们假设已经通过CryptoAPI解码证书文件,并且得到了X509证书上下文句柄:

PCCERT_CONTEXT	m_pCertContext;

      那么可以通过函数CertGetCertificateContextProperty()来获取证书的HASH值,该函数的定义如下:

BOOL WINAPI CertGetCertificateContextProperty(
  PCCERT_CONTEXT pCertContext,
  DWORD dwPropId,
  void* pvData,
  DWORD* pcbData
);
其中:

pCertContext:为证书上下文句柄。

dwPropId:HASH算法ID,常用的有CERT_MD5_HASH_PROP_ID和CERT_SHA1_HASH_PROP_ID,分别对应MD5和SHA1。不过目前标准的V3版本的证书,都是使用SHA1算法。

pvData:接受HASH数据的Buffer地址。

pcbData:开始指明Buffer长度,函数返回后指明实际数据长度。

      那么使用该函数获取证书HASH数据的完整函数如下:

ULONG CCSPCertificate::get_HashValue(LPBYTE lpbtHash, ULONG *pulHashLen)
{
	ULONG ulRes = 0;
	ULONG ulHashAlg = 0;

	if (!m_pCertContext)
	{
		return CERT_ERR_INVILIDCALL;
	}

	if (!pulHashLen)
	{
		return CERT_ERR_INVALIDPARAM;
	}

	get_HashAlgID(&ulHashAlg);
	switch(ulHashAlg)
	{
	case CERT_HASH_ALG_MD5:
		CertGetCertificateContextProperty(m_pCertContext, CERT_MD5_HASH_PROP_ID, lpbtHash, pulHashLen);
		break;
	case CERT_HASH_ALG_SHA1:
		CertGetCertificateContextProperty(m_pCertContext, CERT_SHA1_HASH_PROP_ID, lpbtHash, pulHashLen);
		break;
	default:
		break;
	}

	if (*pulHashLen == 0)
	{
		ulRes = GetLastError();
	}
	else
	{
		ulRes = CERT_ERR_OK;
	}
	
	return ulRes;
}

      使用本人的证书解析工具查看证书的HASH值如下图:

(该工具代码工程可以在本人的下载资源中下载,下载连接:X509证书解析工具V1.1)

©️2020 CSDN 皮肤主题: 大白 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值