|
接口名 |
描述 |
| PrivateKey | A private key |
| PublicKey | A public key |
|
类名 |
描述 |
| Signature | The Signature class is used to provide applications the functionality of a digital signature algorithm. |
| KeyPair | This class is a simple holder for a key pair (a public key and a private key) |
| KeyPairGenerator | The KeyPairGenerator class is used to generate pairs of public and private keys. |
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;
}
}
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;
}
}
}
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);
}
}
package com.hzj.util;
import sun.misc.BASE64Encoder;
import sun.misc.BASE64Decoder;
public class StringHelper {
/**
* BASE64Encoder 加密
* @param data 要加密的数据
* @return 加密后的字符串
*/
public static String encryptBASE64(byte[] data) {
BASE64Encoder encoder = new BASE64Encoder();
String encode = encoder.encode(data);
return encode;
}
/**
* BASE64Decoder 解密
* @param data 要解密的字符串
* @return 解密后的byte[]
* @throws Exception
*/
public static byte[] decryptBASE64(String data) throws Exception {
BASE64Decoder decoder = new BASE64Decoder();
byte[] buffer = decoder.decodeBuffer(data);
return buffer;
}
}
package com.hzj.main;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.security.NoSuchAlgorithmException;
import com.hzj.security.DataSecurity;
import com.hzj.security.KeyPairUtil;
public class Program {
public static void main(String[] args) {
// 1.生成证书
// File file = new File("ca.key");
// try {
// FileOutputStream fileOutputStream = new FileOutputStream(file);
// KeyPairUtil.initAndStoreKeyPair(fileOutputStream);
// } catch (FileNotFoundException | NoSuchAlgorithmException e) {
// e.printStackTrace();
// }
// 2.生成数字签名
// DataSecurity dataSecurity = new DataSecurity();
// String sign = dataSecurity.sign("大家好");
// System.out.println("sign:" + sign);
//3.验证数字签名
DataSecurity dataSecurity = new DataSecurity();
boolean result = dataSecurity.verifySign("大家好", "MCwCFCDs3sBw/fXK9flndl0M5lAUiPYFAhR9vyNNc91UiUBxFwK3GzLLjWgTkQ==");
System.out.println("result:" + result);
}
}
机械节能产品生产企业官网模板...
大气智能家居家具装修装饰类企业通用网站模板...
礼品公司网站模板
宽屏简约大气婚纱摄影影楼模板...
蓝白WAP手机综合医院类整站源码(独立后台)...苏ICP备2024110244号-2 苏公网安备32050702011978号 增值电信业务经营许可证编号:苏B2-20251499 | Copyright 2018 - 2025 源码网商城 (www.ymwmall.com) 版权所有