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

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

DataSignaturer类:


package com.hzj.security;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.PublicKey;
import java.security.Signature;
import java.security.SignatureException;
public class DataSignaturer {
 private PrivateKey privateKey;
 private PublicKey publicKey;
 public DataSignaturer(PublicKey publicKey, PrivateKey privateKey){
 this.privateKey = privateKey;
 this.publicKey = publicKey;
 }
 /**
 * 进行数字签名
 * @param data
 * @return
 */
 public byte[] sign(byte[] data) {
 if (this.privateKey == null) {
 System.out.println("privateKey is null");
 return null;
 }
 Signature signer = null;
 try {
 signer = Signature.getInstance(this.privateKey.getAlgorithm());
 } catch (NoSuchAlgorithmException e) {
 System.out.println(e.getMessage());
 }
 try {
 signer.initSign(this.privateKey);
 } catch (InvalidKeyException e) {
 System.out.println(e.getMessage());
 }
 try {
 signer.update(data);
 return signer.sign();
 } catch (SignatureException e) {
 System.out.println(e.getMessage());
 return null;
 } catch (NullPointerException e) {
 System.out.println(e.getMessage());
 return null;
 }
 }
 /**
 * 验证数字签名
 * @param data
 * @param signature
 * @return
 */
 public boolean verifySign(byte[] data, byte[] signature) {
 if (this.publicKey == null) {
 System.out.println("publicKey is null");
 return false;
 }
 Signature signer = null;
 try {
 signer = Signature.getInstance(this.publicKey.getAlgorithm());
 } catch (NoSuchAlgorithmException e) {
 System.out.println(e.getMessage());
 return false;
 }
 try {
 signer.initVerify(this.publicKey);
 } catch (InvalidKeyException e) {
 System.out.println(e.getMessage());
 return false;
 }
 try {
 signer.update(data);
 return signer.verify(signature);
 } catch (SignatureException e) {
 System.out.println(e.getMessage());
 return false;
 }
 }
}

KeyPair类:


package com.hzj.security;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OutputStream;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;
public class KeyPairUtil {
 // 采用的双钥加密算法,既可以用DSA,也可以用RSA
 public static final String KEY_ALGORITHM = "DSA";
 /**
 * 从输入流中获取KeyPair对象
 * @param keyPairStream
 * @return
 */
 public static KeyPair loadKeyPair(InputStream keyPairStream) {
 if (keyPairStream == null) {
 System.out.println("指定的输入流=null!因此无法读取KeyPair!");
 return null;
 }
 try {
 ObjectInputStream ois = new ObjectInputStream(keyPairStream);
 KeyPair keyPair = (KeyPair) ois.readObject();
 ois.close();
 return keyPair;
 } catch (Exception e) {
 System.out.println(e.getMessage());
 }
 return null;
 }
 /**
 * 将整个KeyPair以对象形式存储在OutputStream流中, 当然也可以将PublicKey和PrivateKey作为两个对象分别存到两个OutputStream流中,
 * 从而私钥公钥分开,看需求而定。
 * @param keyPair 公钥私钥对对象
 * @param out 输出流
 * @return
 */
 public static boolean storeKeyPair(KeyPair keyPair, OutputStream out) {
 if ((keyPair == null) || (out == null)) {
 System.out.println("keyPair=" + keyPair + ", out=" + out);
 return false;
 }
 try {
 ObjectOutputStream oos = new ObjectOutputStream(out);
 oos.writeObject(keyPair);
 oos.close();
 return true;
 } catch (FileNotFoundException e) {
 System.out.println(e.getMessage());
 } catch (IOException e) {
 System.out.println(e.getMessage());
 }
 return false;
 }
 /**
 * 生成KeyPair公钥私钥对
 * 
 * @return
 */
 public static KeyPair initKeyPair() throws NoSuchAlgorithmException{
 KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance(KEY_ALGORITHM);
 keyPairGen.initialize(1024);
 return keyPairGen.genKeyPair();
 }
 /**
 * 生成密钥,并存储
 * @param out
 * @return
 * @throws NoSuchAlgorithmException
 */
 public static boolean initAndStoreKeyPair(OutputStream out) throws NoSuchAlgorithmException {
 return storeKeyPair(initKeyPair(), out);
 }
}