数字签名,,package cn.i
分享于 点击 12610 次 点评:194
数字签名,,package cn.i
package cn.itcast.gz;import java.io.ByteArrayOutputStream;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;import java.security.Key;import java.security.KeyPair;import java.security.KeyPairGenerator;import java.security.PrivateKey;import java.security.PublicKey;import java.security.Signature;/** * 私钥就像一个人的笔迹或印章,是每个人独有的,同时又是人人可以检验的。使用 私钥加密消息摘要,就像在文件上签名或盖章,确认了数据的身份。 * * 数字签名的基础是公钥和私钥的非对称加密,发送者使用私钥加密消息摘要(签名),接收者使用公钥解密消息摘要以验证签名是否是某个人的。 基本步骤: * 得到keyPairGenerator的实例对象,并调用其generateKeyPair()方法创建KeyPair对象。 * 调用KeyPair对象的getPrivate和getPublic方法,分别得到PrivateKey对象和PublicKey对象。 * 得到Signature的实例对象,调用其initSign()方法和指定PrivateKey对象,然后调用update方法和sign方法产生签名 * 调用Signature对象的initVerify * ()方法和指定PublicKey对象,然后调用update方法和verify()方法对原始数据的签名进行验证。 扩展步骤: * 把公钥和私钥分别保存为公钥文件和私钥文件 * ,把公钥文件传递给对方,用私钥文件对其他文件进行签名后,再把其他文件和签名的结果文件传递给对方,让对方用公钥文件进行签名验证。 * */public class SignatureTest { public static void main(String[] args) throws Exception { sign(); verify(); } /** * 数字签名的方法 */ public static void sign() throws Exception { // 得到密钥对生成器 KeyPairGenerator generator = KeyPairGenerator.getInstance("RSA"); // 得到密钥对 KeyPair keyPair = generator.generateKeyPair(); // 得到公钥 PublicKey publicKey = keyPair.getPublic(); // 得到私钥 PrivateKey privateKey = keyPair.getPrivate(); Signature signature = Signature.getInstance("SHA1withRSA"); // 用私钥进行签名 signature.initSign(privateKey); // 设置要签名的数据 signature.update("要签名的数据".getBytes()); // 对数据执行签名的操作 byte[] result = signature.sign(); // 把公钥保存到硬盘的文件上 saveKey(publicKey, "publicKey.key"); // 把签名后得到的消息摘要保存到硬盘的某个文件上 saveDate(result, "signData.data"); } /** * 对数字签名进行校验的方法 */ public static void verify() throws Exception { Signature signature = Signature.getInstance("SHA1withRSA"); // 从硬盘中加载公钥 PublicKey publicKey = (PublicKey) loadKey("F://publicKey.key"); signature.initVerify(publicKey); // 从硬盘中读取签名后得到的消息摘要 byte[] data = loadData("F://signData.data"); signature.update("要签名的数据".getBytes()); boolean isMySign = signature.verify(data); System.out.println(isMySign); } private static void saveDate(byte[] result, String fileName) throws Exception { FileOutputStream outputStream = new FileOutputStream(new File("F://" + fileName)); outputStream.write(result); outputStream.close(); } private static Key loadKey(String path) throws Exception { ObjectInputStream inputStream = new ObjectInputStream( new FileInputStream(new File(path))); Key key = (Key) inputStream.readObject(); return key; } private static void saveKey(Key key, String fileName) throws Exception { ObjectOutputStream outputStream = new ObjectOutputStream( new FileOutputStream(new File("F://" + fileName))); outputStream.writeObject(key); outputStream.close(); } private static byte[] loadData(String path) throws Exception { FileInputStream inputStream = new FileInputStream(new File(path)); ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); byte[] buffer = new byte[1024]; int len = 0; while ((len = inputStream.read(buffer)) != -1) { outputStream.write(buffer, 0, len); } inputStream.close(); outputStream.close(); return outputStream.toByteArray(); }}//该片段来自于http://byrx.net
用户点评