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)

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-08-02 08:40:42

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

CSP:使用CryptoAPI解析X509证书基本项

在之前的文章"CSP:使用CryptoAPI解码X509证书内容"里,讲述了如何使用CryptoAPI将证书文件解码,得到证书上下文句柄PCCERT_CONTEXT的方法.下面我们接着讲述如何通过证书上下文句柄,获得想要的证书项.本文先讲述如何获取证书的基本项,后面还有文章介绍如何获取证书的扩展项. 下面的代码,都是假定已经通过解码证书文件.得到了证书上下文句柄m_pCertContext.至于如何解码证书文件.得到证书上下文句柄m_pCertContext,请阅读之前的文章. 首先,

使用CryptoAPI解析X509证书和P12证书

读入一个CER文件,CertCreateCertificateContext生成CERT_CONTEXT.CERT_CONTEXT这个数据结构中有一项CERT_INFO,CERT_INFO里面有一项SubjectPublicKeyInfo,  SubjectPublicKeyInfo是一段PUBLICKEY_INFO类型的数据段,里面保存的是算法的ID和DER编码的公钥.有了这段DER编码,我们就可以用其他工具(比如openssl)来解析公钥的各项参数.遗憾的是,CryptoAPI定义的接口却不

[转贴]使用CryptoAPI解析X509证书和P12证书

原文在 http://bbs.pediy.com/archive/index.php?t-97663.html,但是觉得这篇文章非常好,我抄下来作我笔记用 一.解析X509证书 1.从磁盘上的证书文件中读取证书数据 unsigned char* pbX509Data; // 证书数据 unsigned long ulX509DataLen; // 证书数据长度 2.获取CertContext PCCERT_CONTEXT pCertContext = CertCreateCertificateC

通过OpenSSL解码X509证书文件

在Windows平台下,如果要解析一个X509证书文件,最直接的办法是使用微软的CryptoAPI.但是在非Windows平台下,就只能使用强大的开源跨平台库OpenSSL了.一个X509证书通过OpenSSL解码之后,得到一个X509类型的结构体指针.通过该结构体,我们就可以获取想要的证书项和属性等. X509证书文件,根据封装的不同,主要有以下三种类型: *.cer:单个X509证书文件,不私钥,可以是二进制和Base64格式.该类型的证书最常见: *.p7b:PKCS#7格式的证书链文件,

WCF使用X509证书自定义验证

接触WCF时间比较短,在项目中要使用X509证书,纠结好几天终于有了结论,因此为了方便日后查阅和园友交流特意单独将部分代码提出,并做以记录. 1.准备工作 制作X509证书,此处用到三个证书名称 导入证书步骤: 第一步:运行mmc 打开控制台,添加证书 将证书导入,再设置证书的读取权限 2.方便阅读下文,先展示下代码整体结构 3.编写服务代码(WcfSite工程下) 服务一: 1 public class HelloService : IHelloService 2 { 3 public str

获取SSL证书的指纹

每一张SSL证书都有指纹(fingerprint)信息,若要获取,可以通过openssl或者certutil工具,分别在非Windows和Windows平台下使用 基本语法: openssl x509 -fingerprint -in cerfile.crt 若是报无法读取文件,那么极有可能是未指定格式,可尝试如下 openssl x509 -fingerprint -in cerfile.crt -inform PEM openssl x509 -fingerprint -in cerfile

Oracle OCP考试及获取OCP证书的方法(经验与坑)

课程目标 分享如何获取Oracle OCP认证及考试过程的哪些坑:让大家了解如何通过Oracle OCP考试.如何获取OCP证书. 适用人群 IT相关人员,在校大学生 课程简介 分享如何获取Oracle OCP认证及考试过程的哪些坑:让大家了解如何通过Oracle OCP考试.如何获取OCP证书. 大致内容如下: 1.Oracle 11g OCA考试与获取OCP证书方法. 2.Oracle 11g OCP考试与获取OCP证书方法. 3.Oracle 11g OCM考试与获取OCP证书方法. 4.

WCF如何使用X509证书(安装和错误)(二)

从当前用户导出到本地计算机的的证书格式为.pfx 并且要导出私钥. 如何创建证书: makecert.exe -sr LocalMachine -ss My -a sha1 -n CN=JiangServer -sky exchange -pe     (服务端证书) makecert.exe -sr LocalMachine -ss My -a sha1 -n CN=JiangClient -sky exchange -pe      (客户端证书) 各种参数的介绍 属性解析 -sr 指定的证

通过PowerShell获取Windows系统密码Hash

当你拿到了系统控制权之后如何才能更长的时间内控制已经拿到这台机器呢?作为白帽子,已经在对手防线上撕开一个口子,如果你需要进一步扩大战果,你首先需要做的就是潜伏下来,收集更多的信息便于你判断,便于有更大的收获.用什么方法才能有尽可能高的权限,同时能更有效的隐藏自己,是留webshell,留后门,种木马还是Rootkit?webshell,哪怕是一句话木马都很容易被管理员清除,放了木马,也容易被有经验的管理员查出,不管是早期自己创建进程,进程被干掉就完了,还是注入进程的木马,或者是以服务自启动的木马