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

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

第二部分:进行数字签名

从密钥文件中读取KeyPair对象。 调用KeyPair对象的getPrivate()和getPublic()方法,分别获取PrivateKey和PublicKey。 利用密钥的指定算法生成Signature实例,然后利用PrivateKey和文件内容,分别调用其initSign()和update()方法,最后调用sign()方法生成数字签名。

第三部分:进行签名验证

从密钥文件中读取KeyPair对象。 调用KeyPair对象的getPrivate()和getPublic()方法,分别获取PrivateKey和PublicKey。 利用密钥的指定算法生成Signature实例,然后利用PublicKey和文件内容,分别调用其initSign()和update()方法,最后利用数字签名调用verify()方法验证签名。

四、参考代码

根据上面的步骤描述,基本可以写出程序来了。下面是参考代码,未必尽善尽美,但是基本功能都体现到了,供你参考。

工程结构:

数据库防篡改

DataSecurity类:


package com.hzj.security;
import java.io.UnsupportedEncodingException;
import java.nio.charset.CharsetEncoder;
import java.security.KeyPair;
import com.hzj.util.StringHelper;
public class DataSecurity {
 private KeyPair keyPair;
 private static final String KEY_FILE = "/ca.key";
 private DataSignaturer dataSignaturer;
 public DataSecurity() {
 try {
 this.keyPair = KeyPairUtil.loadKeyPair(getClass().getResourceAsStream("/ca.key"));
 this.dataSignaturer = new DataSignaturer(this.keyPair.getPublic(), this.keyPair.getPrivate());
 } catch (RuntimeException e) {
 System.out.println("没有找到KeyPair文件[/ca.key]!");
 }
 }
 /**
 * 验证数字签名
 * @param data
 * @param signs
 * @return
 */
 public boolean verifySign(String data, String signs) {
 if ((data == null) || (signs == null)) {
 System.out.println("参数为Null");
 }
 boolean verifyOk = false;
 try {
 verifyOk = this.dataSignaturer.verifySign(data.getBytes("UTF-8"), StringHelper.decryptBASE64(signs));
 } catch (RuntimeException e) {
 System.out.println("fail!data=" + data + ", sign=" + signs + ", exception:" + e.getMessage());
 } catch (UnsupportedEncodingException e) {
 System.out.println("不支持UTF-8字符集");
 } catch (Exception e) {
 System.out.println("Exception:" + e.getMessage());
 }
 if (!verifyOk) {
 System.out.println("fail!data=" + data + ", sign=" + signs + ", verifyOk=false!");
 }
 return verifyOk;
 }
 /**
 * 生成数字签名
 * @param data
 * @return
 */
 public String sign(String data)
 {
 if (data == null) {
 System.out.println("参数为Null");
 }
 String sign = null;
 try
 {
 sign = StringHelper.encryptBASE64(this.dataSignaturer.sign(data.getBytes("UTF-8")));
 }
 catch (UnsupportedEncodingException e)
 {
 System.out.println("不支持UTF-8字符集");
 }
 catch (Exception e)
 {
 System.out.println(e.getMessage());
 }
 return sign;
 }
 }