要确定一份代码是否安全,首先要搞清楚两个问题:
- 这份代码来自哪里
- 这份代码是否被篡改过
ava.security 包提供了很多成熟算法。
1 消息摘要
消息摘要(Message Digest)是数据块的数据指纹。具有两个基本属性:
- 如果数据改变了,消息摘要也会改变
- 拥有给定消息的伪造者不能创建与原消息具有相同摘要的假消息
Java 已实现 MD5、SHA-1、SHA-256、SHA-384 和 SHA-512,推荐后三种。实现类,java.security.MessageDigest
MessageDigest alg = MessageDigest.getInstance("SHA-1");
alg.update(bytes);
byte[] hash = alg.digest();
2 消息签名
私钥签名,公钥校验
- 对称加密: DES、3DES、AES、
- 不对称加密:RSA
3 签名校验
3.1 生成证书
JDK 的 keytool 程序,用于生成和管理证书。管理密钥库、证书数据库和私有/共有密钥对。
创建密钥库,生成密钥
keytool -genkeypair -keystore alice.certs -alias alice
导出证书文件
keytool -exportcert -keystore alice.certs -alias alice -file alice,cer
打印证书
keytool -printcert -file alice.cer
导入密钥库
keytool -importcert -keystore bob.certs -alias alice -file alice.cer
3.2 签名和校验
jarsigner 工具负责对 JAR 文件签名和校验
添加签名
jarsigner -keystore alice.certs document.jar alice
校验签名
jarsigner -verify -keystore bob.certs document.jar
4 认证问题
通过受信赖的第三方担保签名
5 证书签名
证书授权(CA),密钥被密钥库种已有的受信任的根密钥签过名,则不必校验证书指纹。
6 证书请求
将 CA 导入密钥库,生成证书请求,对目标密钥签名,导入密钥库
7 代码签名
对 jar 签名,不再广泛使用了