1.时间戳服务器TSA的概念:
作为一个权威的、可信赖的、公正的第三方数字证书颁发机构,其时间戳服务就是将经过时间戳服务器签名的一个可信赖的日期和时间与特定电子数据绑定在一起,为服务器端和客户端应用提供可信的时间证明。
2.网上能看到的泛滥的时间戳工作示意图:
我之前找到的资料里都有这个图。这个图从概念上讲述了时间戳服务的流程。但是如果我们要从代码上模拟一个TSA出来,这个图并没有本质上的帮助。
3.网上能找到的另一个泛滥的"时间戳服务工作流程":
1.用户对文件数据进行Hash摘要处理
2.用户提出时间戳的请求,Hash值被传递给时间戳服务器
3.时间戳服务器对哈希值和一个日期/时间记录进行签名,生成时间戳
4.时间戳数据和文件信息绑定后返还,用户进行下一步电子交易操作
那么我们都知道了TSA就是把时间绑定到文件的摘要中,可是怎么绑定?过程如何?
wikipedia为我们解密了这个流程,下面2幅图可以很清晰的看出具体的操作:
第一幅是加时间戳的过程:
第二幅是时间戳验证的过程
4.从图中可以总结出的TSA详细流程:
盖时间戳:
(1) 对欲发送的文件做Hash得到消息摘要
(2) 将消息摘要发送给TSA
(3) TSA把 (消息摘要+当前时间)—》Hash = 带有时间戳的消息摘要的hash值
(4) 将带有时间戳的消息摘要hash值 用TSA的私钥加密
(5) 将 私钥加密后的数据 + 明文时间 (就是第3步的那个“当前时间”) 返回给用户A
(6) 用户A爱怎么玩怎么玩。。。
时间戳验证:
(1) 用户B收到了用户A加入了TSA私钥加密的消息时间摘要的消息,把这个TSA时间戳拿出来(涉及其他解密,这里略去)
(2) 接下来这步在我们个人的简易实现里是没有的: 将TSA私钥加密的消息时间摘要重新发回TSA验证此摘要真实性
(3) 验证真的是那个TSA发布的,然后就拿TSA的公钥对 "TSA私钥加密的消息时间摘要"中的 私钥加密后的数据 进行解密,明文时间留着备用
(4) 解密完得到 带有时间戳的消息摘要的hash值 (标准值)
(5) 使用收到的文件解密完再次hash得到消息摘要
(6) (消息摘要+当前时间)—》Hash = 带有时间戳的消息摘要的hash值 (验证值)
(7) 标准值 ?= 验证值 可以验证消息是否受到重放攻击等
这样,有了详细的流程,用JAVA模拟TSA加盖时间戳的代码就很容易实现了。代码之后附上。
5.相关资料: