使用数字签名实现数据库记录防篡改(Java实现)

2019-12-30 16:12:08丽君

数字签名,顾名思义,就类似于一种写在纸上的普通的物理签名,不同的是,数字签名是电子信息化的,采用双钥加密的技术实现,是一种用于鉴别数字信息的方法。处理的过程,简单说就是将文件内容进行hash散列,信息发送者对散列后的字符串使用私钥加密,得到的最终字符串就是签名。然后将得到的签名字符串添加到文件信息的后面一同发送出去。接收者获取到文件信息和签名后,使用公钥对签名进行解密,就得到文件内容加密后的hash散列。此时,他可以对获取到的文件内容做hash散列,与签名中的hash散列进行匹对,从而鉴别出最终获取信息的真伪。主要过程如这四幅图所示[2]:

数据库防篡改

对文件内容进行hash散列,生成摘要

数据库防篡改

对生成的摘要,使用私钥进行加密,形成签名

数据库防篡改

将得到的签名,附到文件内容后部,就想到与签名签到文件尾部那样子

数据库防篡改

使用公钥对签名进行解密,得到摘要,并与获取到的文件内容生成的摘要做对比,以确定是否被篡改

想了解更详细的数字证书相关内容,可以访问此地址:http://www.easck.com/signature.html。里面解释得很形象,应该一看就明白的了。

三、实现步骤

看到这里,开篇提出的问题也就呼之欲出了。没错,就是使用数字签名技术,将数据库中的重要字段进行签名,将签名结果作为记录的一列存在记录中。这样当有人入侵数据库,恶意修改字段,程序读数据时拿签名校验一下,就知道数据是否有被修改过了。

在java.security包中,有很多有用的类,用以进行安全机制的开发。对于要创建数字签名,我们主要用到以下的接口或类:

 

接口名

描述

PrivateKey

A private key

PublicKey

A public key