vc++网络安全编程范例(18)-open ssl 实现数字证书编程
数字证书就是互联网通讯中标志通讯各方身份信息的一系列数据,提供了一种在Internet上验证您身份的方式,其作用类似于司机的驾驶执照或日常生活中的身份证。它是由一个由权威机构-----CA机构,又称为证书授权(Certificate Authority)中心发行的,人们可以在网上用它来识别对方的身份。数字证书是一个经证书授权中心数字签名的包含公开密钥拥有者信息以及公开密钥的文件。最简单的证书包含一个公开密钥、名称以及证书授权中心的数字签名
数字证书是一种权威性的电子文档,由权威公正的第三方机构,即CA中心签发的证书。
它以数字证书为核心的加密技术可以对网络上传输的信息进行加密和解密、数字签名和签名验证,确保网上传递信息的机密性、完整性。使用了数字证书,即使您发送的信息在网上被他人截获,甚至您丢失了个人的账户、密码等信息,仍可以保证您的账户、资金安全。
它能提供在Internet上进行身份验证的一种权威性电子文档,人们可以在互联网交往中用它来证明自己的身份和识别对方的身份。当然在数字证书认证的过程中证书认证中心(CA)作为权威的、公正的、可信赖的第三方,其作用是至关重要的.如何判断数字认证中心公正第三方的地位是权威可信的,国家工业和信息化部以资质合规的方式,陆续向天威诚信数字认证中心等30家相关机构颁发了从业资质。
由于Internet网电子商务系统技术使在网上购物的顾客能够极其方便轻松地获得商家和企业的信息,但同时也增加了对某些敏感或有价值的数据被滥用的风险. 为了保证互联网上电子交易及支付的安全性,保密性等,防范交易及支付过程中的欺诈行为,必须在网上建立一种信任机制。这就要求参加电子商务的买方和卖方都必须拥有合法的身份,并且在网上能够有效无误的被进行验证。
数字证书可用于:发送安全电子邮件、访问安全站点、网上证券交易、网上招标采购、网上办公、网上保险、网上税务、网上签约和网上银行等安全电子事务处理和安全电子交易活动。
数字证书里存有很多数字和英文,当使用数字证书进行身份认证时,它将随机生成128位的身份码,每份数字证书都能生成相应但每次都不可能相同的数码,从而保证数据传输的保密性,即相当于生成一个复杂的密码。
数字证书绑定了公钥及其持有者的真实身份,它类似于现实生活中的居民身份证,所不同的是数字证书不再是纸质的证照,而是一段含有证书持有者身份信息并经过认证中心审核签发的电子数据,可以更加方便灵活地运用在电子商务和电子政务中。
我们来用VC++实现证书库注册,请见代码实现与注释讲解
#include <stdio.h>
#include <windows.h>
#include <wincrypt.h>
#define MY_ENCODING_TYPE (PKCS_7_ASN_ENCODING | X509_ASN_ENCODING)
void HandleError(char *s);
void main()
{
//--------------------------------------------------------------------
// 变量申明与初始化 www.zzzyk.com
HCERTSTORE hSystemStore; //系统证书库句柄
DWORD dwFlags= CERT_SYSTEM_STORE_CURRENT_USER; //系统证书库保存位置
LPCWSTR pvSystemName= L"MYSTORE"; // 证书库名称
CERT_PHYSICAL_STORE_INFO PhysicalStoreInfo; //物理证书库结构
BYTE fResponse = 'n';
if(CertRegisterSystemStore(
pvSystemName,//系统证书库名称
dwFlags, //系统证书库保存位置
NULL,
NULL))
{
printf("系统证书库%S 已被注册. \n",pvSystemName);
}
else
{
printf("系统证书库没有注册. \n");
}
//--------------------------------------------------------------------
// 初始化PhysicalStoreInfo.
PhysicalStoreInfo.cbSize=sizeof(CERT_PHYSICAL_STORE_INFO);
PhysicalStoreInfo.pszOpenStoreProvider=(char *)CERT_STORE_PROV_FILENAME;
PhysicalStoreInfo.dwFlags=CERT_PHYSICAL_STORE_ADD_ENABLE_FLAG;
PhysicalStoreInfo.dwPriority=1;
PhysicalStoreInfo.dwOpenEncodingType=MY_ENCODING_TYPE;
PhysicalStoreInfo.OpenParameters.pbData = (BYTE *) L"e:\\mystore\\TestStor.sto";
PhysicalStoreInfo.OpenParameters.cbData = (wcslen((LPWSTR) PhysicalStoreInfo.OpenParameters.pbData) + 1) * sizeof(WCHAR);
//--------------------------------------------------------------------
// 向系统证书库注册一个物理库
if(CertRegisterPhysicalStore(
pvSystemName, //系统证书库名称
dwFlags, //标志位,指示证书库存储位置。
L"TESTOR.STO", //物理证书库名称
&PhysicalStoreInfo, //
NULL
))
{
printf("物理证书库已被注册. \n");
}
else
{
printf("物理证书库没有被注册.\n");
}
//--------------------------------------------------------------------
// 反注册系统证书库
printf("想要反注册这个%S 证书库吗? (y/n) ",pvSystemName);
scanf("%c",&fResponse);
if(fResponse=='y')
{
if(CertUnregisterSystemStore(
pvSystemName,
dwFlags))
{
printf("系统证书库%S 已经被反注册.\n",pvSystemName);
}
else
{
printf("此系统证书库未被反注册.\n");
}
}
} // End
补充:综合编程 , 安全编程 ,