我们在文件上签字盖章时,经常还需要签署上当前的日期时间。这是因为签署的时间是重要的签署特征,在法律上也有相应的作用和意义。与之相应的,进行数字签名时,签名发生的时间一样是重要要件,比如在电子医疗、电子病历应用中。那么数字签名的时间来自哪里呢?大部分开发工程师肯定会说取系统时间,这也是最简单快捷的方法。大部分情况下这样做没有问题,但在安全要求严格的场景下,系统时间是不牢靠的。主要有两个原因:一个是准确性,系统时间本身可能就有误差,时间数值在传递过程中也有可能被篡改;第二个是可信赖,签名时间既然如此重要,那签名时间是谁来提供就是个问题:用甲方的时间乙方可能不信,用乙方的时间甲方又会不爽。
这时就需要一个可靠的、大家都信任的时间作为签名的时间。在互联网上,提供这样的时间的服务就叫时间戳。从上面的分析看出,时间戳服务解决的是时间的准确性和可信赖问题,因此相应包括两部分:时间源和数字签名。时间源一般采用中科院国家授时中心、GPS、北斗卫星、CDMA、NTP服务器等时间源的精确时间。如果时间戳服务需要直接具备法律效力,那只能采用国家授时中心发布的时间源;否则可以采用其他时间源发布的时间。采用国家授时中心发布的时间费用不低(我记得单次是10元),因此在某些场合下,如企业内部应用,可以采用其他时间源发布的时间。另外,补充一下,用非国家授时中心时间源发布的时间,并非没有法律效力,而是需要通过司法鉴定有效后,才能作为法律诉讼的证据。
光有准确的时间源还不够,因为时间作为电子数据,存在传输过程中被篡改的可能性。这时很容易就想到使用数字签名保护时间数据的完整性和不可抵赖性。这也就是时间戳里“戳”的来历。一般时间戳服务的生成过程如下:
1.用户提交业务数据到时间戳服务器;
2.时间戳服务器发送时间请求到时间源;
3.时间源将时间返回给时间戳服务器;
4.时间戳服务器将业务数据与时间组合签名;
- 时间戳服务器将签名结果返回给用户。
用户通过验证时间戳里的签名,就可以确认时间的有效性和其来源。
数字签名保证了时间戳服务的完整性和不可抵赖,而时间戳本身的可信赖性则来源于提供时间戳服务的机构(英文简称TSA)的商誉和公信力,所以在实际应用中,基本都是由CA提供时间戳服务。提供的方式也分为两种:一种是系统建设模式,这种模式就是在用户内部搭建一套独立时间戳服务系统,为用户的业务系统提供时间戳服务。这种模式适用于*(企业)内部、时间戳使用量比较大的情况;另外一种就是采用互联网服务方式。用户无需建设时间戳系统,业务系统通过网络直接调用时间戳服务提供的接口。
时间戳服务虽然有行业规范,但没有形成统一标准,基本上是“谁生成、谁验证”。时间戳服务一般以本地COM接口或远程WebServices接口方式提供,结合开发时也比较容易。下面是调用WebServices生成时间戳的例子:
//用SoapClient
var soapclient = new ActiveXObject(“MSSOAP.SoapClient30”);
//屏蔽服务的描述地址
soapclient.MSSoapInit(“http://xxx?wsdl”);
//调用createTimeStampByPlain方法生成时间戳对象
variables.timestamp = soapclient.createTimeStampByPlain(variables.signTime);
if (variables.timestamp != “”) {
//生成时间戳成功后,读取各个属性
variables.timestampcert = soapclient.getTokenCertificate(variables.timestamp)
var timestamp = soapclient.getTimeStampCreatTime(variables.timestamp);
var oldwidth = variables.picture.width;
var oldheight = variables.picture.height;
variables.picture = variables.picture.AppendTimeStampArea(timestamp);
variables.width = variables.width * variables.picture.width / oldwidth;
variables.height = variables.height * variables.picture.height / oldheight;
variables.signTime = convertstamptime(timestamp);
}
目前,时间戳已经广泛应用在司法、行政执法、知识产权保护、档案、金融、证券保险、电子商务、医疗卫生、电信等各领域。虽然数字签名是使用时间戳最多的应用,但并不是说只有数字签名时才能使用时间戳。任何需要准确可信时间的应用,都可以使用时间戳服务。