基本步骤
签名方:
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
原文地址:http://nimalegebi.blog.51cto.com/5614287/1828893