数据签名

Wu Jun 2020-01-03 15:43:49
Categories: > > Tags:

要确定一份代码是否安全,首先要搞清楚两个问题:

  1. 这份代码来自哪里
  2. 这份代码是否被篡改过

ava.security 包提供了很多成熟算法。

1 消息摘要

消息摘要(Message Digest)是数据块的数据指纹。具有两个基本属性:

  1. 如果数据改变了,消息摘要也会改变
  2. 拥有给定消息的伪造者不能创建与原消息具有相同摘要的假消息

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 消息签名

私钥签名,公钥校验

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 签名,不再广泛使用了