码迷,mamicode.com
首页 > 编程语言 > 详细

JAVA 实现 基于RSA算法的签名验签

时间:2016-07-22 19:35:07      阅读:247      评论:0      收藏:0      [点我收藏+]

标签:java rsa sha base64   签名 验签

基本步骤

签名方:

1用sha1算出原文的摘要

2用私钥对摘要进行加密

3对密文进行BASE64编码


验证方:

1对密文进行BASE64解码

2用公钥对解码后的密文解密

3用sha1对原文计算摘要并和解密后的明文比对


上干货

//参数字符串
        String userId="2312sd";
        String orderId="232djfj";
        String price="12312";
        //用于签名和传输的字符串
        StringBuffer bufferStr =new StringBuffer();
        bufferStr.append("userId=").append(userId)
        .append("&orderId=").append(orderId)
        .append("&price=").append(price);
        //随机生成秘钥对
        //指定算法为RSA
        KeyPairGenerator  kpg =KeyPairGenerator.getInstance("RSA");
        //初始化
        kpg.initialize(1024);
        //获取秘钥对
        KeyPair keyPair =kpg.generateKeyPair();
        
        //数字签名开始
        //第一步,对原文进行sha1
        String localStr =bufferStr.toString();
        MessageDigest md =MessageDigest.getInstance("SHA");
        byte[] shaDigest=md.digest(localStr.getBytes("utf-8"));
        //第二部,使用私钥对原文进行加密
        Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
        //ENCRYPT_MODE表示为加密模式
        cipher.init(Cipher.ENCRYPT_MODE, keyPair.getPrivate());
        //加密
        byte[] rsaBytes = cipher.doFinal(shaDigest);
        //base64编码
        byte[] base64Str = Base64.getEncoder().encode(rsaBytes);
        String base64enCode=new String(base64Str);
        //签名加密完成数据传输到客户端
        
        //客户端验证签名开始
        //解码base64
        //获取原文
        String receiveStr=localStr;
        byte[] bese64Decoded =Base64.getDecoder().decode(base64enCode.getBytes());    
        //用公钥进行解密
        Cipher cipher2 = Cipher.getInstance("RSA/ECB/PKCS1Padding");
        cipher2.init(Cipher.DECRYPT_MODE, keyPair.getPublic());
        byte[] rsadecode= cipher2.doFinal(bese64Decoded);
        String sha1=Base64.getEncoder().encodeToString(rsadecode);
        String sha2=Base64.getEncoder().encodeToString(md.digest(receiveStr.getBytes("utf-8")));
        if(sha1.equals(sha2))
            System.out.println("验签成功");
        else
            System.out.println("验签失败");

说明:  这里只是简单的实现了在本地的单向签名,后面见陆续实现,双向签名,基于HTTPS的跨域签名验签。

本文出自 “你爸披肩发” 博客,请务必保留此出处http://nimalegebi.blog.51cto.com/5614287/1828893

JAVA 实现 基于RSA算法的签名验签

标签:java rsa sha base64   签名 验签

原文地址:http://nimalegebi.blog.51cto.com/5614287/1828893

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!