原来是这样的 PKCS
敏感数据加密在聚合支付系统中是硬性的要求,因此在系统中 RSA 加密无处不在。这几天在为系统开发 Java SDK,由于是初学 Java,过程中的密钥转换、加解密、签名等颇有一番折腾。现在 SDK 开发已结整,今天抽点时间把与 RSA 相关的各种知识梳理一下。
PKI
公开密钥基础建设 (Public key infrastructure),又称公开密钥基础架构、公钥基础建设、公钥基础设施、公开密码匙基础建设或公钥基础架构,是一组由硬件、软件、参与者、管理政策与流程组成的基础架构,其目的在于创造、管理、分配、使用、存储以及撤销数字证书。 密码学上,公开密钥基础建设借着数字证书认证机构将用户的个人身份跟公开密钥链接在一起。
简单来说,它是在1976年提出的一套密码学理论,后来以 PIK为基础设计出了一系列的公开密钥算法,常用的 RSA、DSA等等。这些算也被称为非对称机密算法,一对密钥由公钥和私钥组成,公钥可以由私钥导出,但私钥不能由由公钥反向推导计算。在实际的使用中,私钥自己持有,公钥可以明文发式发送给别人,从而解决了密钥交换的问题。
除了密码学算法,从PKI基础上也发展出了一些安全协议,像互联网上广泛应用的 SSL 协议、SET协议等。
SSL 协议利用 PKI 技术来进行身份验证、完成数据加密算法及密钥交换,很好地解决了身份验证、加密传输和密钥分发等问题。
SET (Secure Electronic Transaction)安全电子交协议,主要采用公钥密码体系和X.509数字证书标准,用于保障网上购物信息的安全性。SET 协议是 PKI 框架下的一个典型实现,同时也在不断升级和完善,如 SET 2.0 将支持借记卡电子交易,在金融领域有着广泛的应用。
XKMS
由微软、VerSign和webMethods三家公司共同发布,全称是 XML 密钥管理规范,也被称为第二代PKI标准。
它由两部分组成:
- XML密钥信息服务规范
- XML 密钥注册服务规范
XKMS 目前已是W3C 推荐使用的标准,微软已在 ASP.net 中集成, VerSign也已发布了基于 Java 的信任服务集成开发工具包。
CA中心
数字证书认证机构(Certificate Authority,缩写为CA),也称为电子商务认证中心、电子商务认证授权机构,是负责发放和管理数字证书的权威机构,并作为电子商务交易中受信任的第三方,承担公钥体系中公钥的合法性检验的责任。
CA中心为每个使用公开密钥的用户发放一个数字证书,数字证书的作用是证明证书中列出的用户合法拥有证书中列出的公开密钥。CA机构的数字签名使得攻击者不能伪造和篡改证书。它负责产生、分配并管理所有参与网上交易的个体所需的数字证书,因此是安全电子交易的核心环节。在SET交易中,CA不仅对持卡人、商户发放证书,还要对获款的银行、网关发放证书。
CA是证书的签发机构,它是公钥基础设施的核心。CA是负责签发证书、认证证书、管理已颁发证书的机关。它要制定政策和具体步骤来验证、识别用户身份,并对用户证书进行签名,以确保证书持有者的身份和公钥的拥有权。
CA也拥有用户的证书(内含公钥)和私钥。网上的公众用户通过验证CA的签名从而信任CA,任何人都可以得到CA的证书(含公钥),用以验证CA所签发的证书。
用户若欲获取证书,应先向CA提出申请,CA判明申请者的身份后,为之分配一个公钥,并将该公钥与其身份信息绑定,为该整体签名,签名后的整体即为证书,发还给申请者。
如果一个用户想鉴别另一个证书的真伪,他就用CA的公钥对那个证书上的签字进行验证,一旦验证通过,该证书就被认为是有效的。
为保证用户之间在网上传递信息的安全性、真实性、可靠性、完整性和不可抵赖性,不仅需要对用户的身份真实性进行验证,也需要有一个具有权威性、公正性、唯一性的机构,负责向电子商务的各个主体颁发并管理符合国际安全电子交易协议标准的电子商务安全证,并负责管理所有参与网上交易的个体所需的数字证书,因此CA是安全电子交易的核心环节。
在CA中心,普遍采的规范的是X.509和PKCS系列。
X.509
X.509 是ITU-T标准化部门基于他们之前的ASN.1定义的一套公钥证书的格式标准。X.509证书里含有公钥、身份信息(比如网络主机名,组织的名称或个体名称等)和签名信息(可以是证书签发机构CA的签名,也可以是自签名)。
在X.509里,组织机构通过发起证书签名请求(CSR)来得到一份签名的证书。首先需要生成一对密钥对,然后用其中的私钥对CSR进行数字签署(签名),并安全地保存私钥。CSR进而包含有请求发起者的身份信息、用来对此请求进行验真的的公钥以及所请求证书专有名称。CSR里还可能带有CA要求的其它有关身份证明的信息。然后CA对这个CSR进行签名。 组织机构可以把受信的根证书分发给所有的成员,这样就可以使用公司的PKI系统了。浏览器(如Firefox)或操作系统预装有可信任的根证书列表,所以主流CA发布的TLS证书都直接可以正常使用。浏览器的开发者直接影响着它的用户对CA的信任。
PKCS
公钥加密标准(Public Key Cryptography Standards, PKCS),此一标准的设计与发布皆由RSA信息安全公司所制定。
PKCS 是一个系列集合,包含有15个标准。其中较常用的为 PKCS1、PKCS8、PKCS12
- PKCS1 RSA密码编译标准,定义了RSA的数理基础、公/私钥格式,以及加/解密、签/验章的流程。
- PKCS8 私钥消息表示标准,专门用来存储私钥的文件格式规范。
- PKCS12 个人消息交换标准,定义了包含私钥与公钥证书(public key certificate)的文件格式。私钥采密码(password)保护。常见的PFX就履行了PKCS#12。
RSA
RSA算法由 RSA公司发布,属于 PKCS系列的加密算法。同时它是我们在日常开发中用得最多的密码学算法。
从上面不难看出,RSA密码学的密钥对应着2个标准: PKCS1 和 PKCS8。这2个标准在定义上存在一些重合又不完全互通,但是可以利用工具在2种标准之间对密钥格式进行转换。
PKCS1私钥转换为PKCS8
1 | openssl pkcs8 -topk8 -inform PEM -in private.pem -outform pem -nocrypt -out pkcs8.pem |
PKCS8格式私钥再转换为PKCS1格式
1 | openssl rsa -in pkcs8.pem -out pkcs1.pem |
从PKCS1私钥中生成PKCS8公钥
1 | openssl rsa -in private.pem -pubout -out public.pem |
从PKCS8私钥中生成PKCS8公钥
1 | openssl rsa -in pkcs8.pem -pubout -out public_pkcs8.pem |
PKCS8公钥转PKCS1公钥
1 | openssl rsa -pubin -in public_pkcs8.pem -RSAPublicKey_out |
PKCS1公钥转换为PKCS8公钥
1 | openssl rsa -RSAPublicKey_in -in pub_pkcs1.pem -pubout |
小技巧
快速区分密钥
- PKCS8公钥格式
1
2
3-----BEGIN PUBLIC KEY-----
base64格式的公钥内容
-----END PUBLIC KEY----- - PKCS1 公钥格式
1
2
3-----BEGIN RSA PUBLIC KEY-----
base64格式的公钥内容
-----END RSA PUBLIC KEY----- - PKCS8 私钥格式
1
2
3-----BEGI PRIVATE KEY-----
base64格式的私钥内容
-----END RSA PRIVATE KEY----- - PKCS1 私钥格式
1
2
3-----BEGIN PRIVATE KEY-----
base64格式的私钥内容
-----END RSA PRIVATE KEY-----
- PKCS8公钥格式
在 Java 体系中,常用 PKCS8 格式的密钥
在其他编成语言中,一般常用 PKCS1 格式的密钥
上一张体系图: