Java实现7种常见密码算法( 四 )


  • 调用方:md5("&")
  • 服务方:md5("\\u0026")这也是一个非常隐晦的坑,如Gson默认就会有这种行为,可使用new GsonBuilder().disableHtmlEscaping()禁用 。
生成与读取证书概念随着对密码学了解的深入 , 会发现有特别多奇怪的名词出现,让人迷惑不已,如PKCS8X.509ASN.1DERPEM等,接下来就来澄清下这些名词是什么,以及它们之间的关系 。
首先,了解3个概念,如下:
  • 密钥:包括对称密钥与非对称密钥等 。
  • 证书:包含用户或网站的身份信息、公钥 , 以及CA的签名 。
  • 密钥库:用于存储密钥与证书的仓库 。
ASN.1语法ASN.1抽象语法标记(Abstract Syntax Notation One),和XML、JSON类似,用于描述对象结构,可以把它看成一种描述语言,简单的示例如下:
Report ::= SEQUENCE {author OCTET STRING,title OCTET STRING,body OCTET STRING,}这个语法描述了一个结构体,它包含3个属性author、title、body,且都是字符串类型 。
DER与PEMDER是ASN.1的一种序列化编码方案,也就是说ASN.1用来描述对象结构,而DER用于将此对象结构编码为可存储的字节数组 。
PEM(Privacy Enhanced Mail)是一种将二进制数据,以文本形式进行存储或传输的方案,早期主要用于邮件中交换证书,它的文本内容常以-----BEGIN XXX-----开头,并以-----END XXX-----结尾,而中间 Body 部分则为 Base64 编码后的数据,如下是一个证书的PEM样例 。
Java实现7种常见密码算法

文章插图
以上面证书为例,PEM与DER的关系大概如下:
PEM = "-----BEGIN CERTIFICATE-----" + base64(DER) +"-----END CERTIFICATE-----"X.509、PKCS8、PKCS12等X.509、PKCS8、PKCS12等都是公钥密码学标准(PKCS)组织制定的各种密码学规范,该组织使用ASN.1语法为密钥、证书、密钥库等定义了标准的对象结构,常见的如下:
  • X.509规范:用于描述证书与公钥的标准格式 。
  • PKCS7规范:可描述的对象很多,不过一般也是用于描述证书的 。
  • PKCS8规范:用于描述私钥的标准格式 。
  • PKCS12规范:用于描述密钥库的标准格式 。
  • PKCS1规范:用于描述RSA算法及其公私钥的标准格式 。
这些规范都有相应的RFC文档,感兴趣的可以前往查看:
PEM:https://www.rfc-editor.org/rfc/rfc7468X.509:https://datatracker.ietf.org/doc/html/rfc5280PKCS7:https://datatracker.ietf.org/doc/html/rfc2315PKCS8:https://datatracker.ietf.org/doc/html/rfc8351PKCS12:https://datatracker.ietf.org/doc/html/rfc7292PKCS1:https://datatracker.ietf.org/doc/html/rfc8017#appendix-A类比一下,如果把ASN.1比作Java,那X.509就是使用Java定义的一个名叫X509的类,这个类里面包含身份信息、公钥信息等相关字段,而DER就是一种Java对象序列化方案,用于将X509这个类的对象序列化为字节数组,字节数组保存为文件后,这个文件就是我们常说的证书或密钥文件 。
常见证书文件由于PKCS组织并未给证书文件定下标准的文件名后缀,所以证书文件有非常多的后缀名,如下:
  • .der: DER编码的证书,一般是X.509规范的,无法用文本编辑器直接打开
  • .pem: PEM编码的证书,一般是X.509规范的
  • .crt: 常见于unix类系统,一般是X.509规范的,可能是DER编码或PEM编码
  • .cer: 常见于windows系统,一般是X.509规范的,可能是DER编码或PEM编码
  • .p7b: 常见于windows系统,PKCS7规范证书,可能是DER编码或PEM编码
  • .pfx:PKCS12规范的密钥库文件,也有取名为.p12的
  • .jks:java专用的密钥库文件格式,在java技术栈内使用较多,非java一般使用.pfx
证书概念小结
Java实现7种常见密码算法

文章插图
生成证书与密钥库openssl命令提供了大量的工具,用以生成密钥、证书与密钥库文件,如下,是一个典型的生成密钥与证书的过程:
# 生成pkcs1 rsa私钥openssl genrsa -out rsa_private_key_pkcs1.key 2048# 生成pkcs1 rsa公钥openssl rsa -in rsa_private_key_pkcs1.key -RSAPublicKey_out -out rsa_public_key_pkcs1.key# 生成证书申请文件cert.csropenssl req -new -key rsa_private_key_pkcs1.key -out cert.csr# 自签名(演示时使用 , 生产环境一般不用自签证书)openssl x509 -req -days 365 -in cert.csr -signkey rsa_private_key_pkcs1.key -out cert.crt# ca签名(将证书申请文件提交给ca机构签名)openssl x509 -req -days 365 -in cert.csr -CA ca_cert.crt -CAkey ca_private_key.pem -CAcreateserial -out cert.crt# 生成p12密钥库文件openssl pkcs12 -export -in cert.crt -inkey rsa_private_key_pkcs1.key -name demo -out keystore.p12

推荐阅读