欢迎访问悦橙教程(wld5.com),关注java教程。悦橙教程  java问答|  每日更新
页面导航 : > > 文章正文

数字签名,,package cn.i

来源: javaer 分享于  点击 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
相关栏目:

用户点评