数字签名校验

//特定于算法的,用于生成公钥和私钥对

KeyPairGenerator keyGen = KeyPairGenerator.getInstance("DSA");
keyGen.initialize(1024);
KeyPair key = keyGen.generateKeyPair();

// 将生成的密钥对序列化到文件

byte[] buffer = key.getPrivate().getEncoded();
         buffer = Base64.encodeBase64(buffer);
         FileOutputStream out = new FileOutputStream("d:/private_test");
         out.write(buffer);
         out.close();

out = new FileOutputStream("d:/public_test");
         buffer = key.getPublic().getEncoded();
         buffer = Base64.encodeBase64(buffer);
         out.write(buffer);
         out.close();

数字签名的验证:

byte[] encodestr = str.getBytes();

//为应用程序提供数字签名算法功能,数字签名用来保证数字数据的真实性和完整性

在所有算法当中,数字签名可以是 NIST 标准的 DSA,它使用 DSA 和 SHA-1。可以将使用 SHA-1 消息摘要算法的 DSA 算法可指定为 SHA1withDSA。如果使用 RSA,对消息摘要算法将有多种选择,因此,可以将签名算法指定为 MD2withRSAMD5withRSASHA1withRSA。没有默认的算法名称,所以必须为其指定名称。

用 Signature 对象签名数据或验证签名包括以下三个阶段:

  1. 初始化,使用
    • 初始化验证签名的公钥(请参见 initVerify),或使用
    • 初始化签署签名的私钥(也可以选择“安全随机数生成器")
  2. 根据初始化类型,这可更新要签名或验证的字节。

  3. 签署或验证所有更新字节的签名。   

     Signature sig = Signature.getInstance("DSA");

//初始化此用于签名的对象       

sig.initSign(readPrivateKey("D:/private_test"));

//更新要由字节签名或验证的数据
        sig.update(encodestr);

//返回所有已更新数据的签名字节。
        byte[] signature = sig.sign();

//   初始化此用于验证的对象。

        sig.initVerify(readPublicKey("d:/public_test"));

      sig.update(encodestr);

//验证传入的签名

      System.out.println(sig.verify(signature));  

//读取文件,生成privateKey(使用密钥工厂以便根据其编码实例化 DSA 私钥)

public static PrivateKey readPrivateKey(String filePath) throws Exception {

//密钥工厂       

KeyFactory keyFactory = KeyFactory.getInstance("DSA");
        FileInputStream istream = new FileInputStream(filePath);
        byte[] buffer = new byte[istream.available()];
        istream.read(buffer);
        buffer = Base64.decodeBase64(buffer);

//对于Private key是用PKCS#8编码
        EncodedKeySpec keySpec = new PKCS8EncodedKeySpec(buffer);

// 根据所提供的密钥规范(密钥材料)生成私钥对象。       

return keyFactory.generatePrivate(keySpec);
    }

//生成publicKey

public static PublicKey readPublicKey(String filePath) throws Exception {
        KeyFactory keyFactory = KeyFactory.getInstance("DSA");
        FileInputStream istream = new FileInputStream(filePath);
        byte[] buffer = new byte[istream.available()];
        istream.read(buffer);
        buffer = Base64.decodeBase64(buffer);

// public key是用X.509编码
        EncodedKeySpec keySpec = new X509EncodedKeySpec(buffer);

        return keyFactory.generatePublic(keySpec);
    }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值