RSA签名算法,计算调用加密报文,安全传输
RSA签名算法
1. 获取当前的时间戳参数
2. 计算参数签名
3. 获取请求对象的MD5密文
4. 通过私钥计算某个参数的RSA签名
5. 转换字符集到utf8
6. MD5加密字符串
7. base64编码
8. base64编码字符串
9. base64解码
/*** 参数签名算法工具类*/
public class RSAUtils {/*** 获取当前的时间戳参数* @return*/public static String getRtick(){long timestamp = new Date().getTime();int rnd = (int)Math.random() * 1000;String rtick = timestamp + "" + rnd;return rtick;}/*** 计算参数签名* @param developerId 开发者ID* @param privateKey 用户私钥* @param host 请求的HOST地址(http://ip:port/context)* @param methodName 请求的接口方法名* @param rtick 时间戳参数* @param urlParams url参数(param1=value1¶m2=value2¶m3=value3)* @param requestBody request body 参数(JSON字符串)* @return*/public static String calcRsaSign(String developerId, String privateKey, String host, String methodName, String rtick, String urlParams, String requestBody) {String url = host+methodName;Map<String, String> mySignedURLParams = new TreeMap<String, String>();mySignedURLParams.put("developerId", developerId);mySignedURLParams.put("rtick", rtick);mySignedURLParams.put("signType", "rsa");if(urlParams != null && !"".equals(urlParams)){String[] params = urlParams.split("&");for(String p1 : params){String[] p2 = p1.split("=");String key = p2[0];String value = "";if(p2.length == 2){value = p2[1];}mySignedURLParams.put(key, value);}}String requestPath;try {requestPath = new URL(url).getPath();}catch (MalformedURLException e) {throw new RuntimeException(e.getMessage(), e);}StringBuilder signStringBuilder = new StringBuilder();for (String name : mySignedURLParams.keySet()) {String value = mySignedURLParams.get(name);signStringBuilder.append(name);signStringBuilder.append("=");signStringBuilder.append(value);}signStringBuilder.append(requestPath);if (requestBody != null && !"".equals(requestBody) ) {String requestMd5 = getRequestMd5(requestBody);signStringBuilder.append(requestMd5);}String signString = signStringBuilder.toString();String rsaSign = calcRsaSign(privateKey, signString);//rsa算出来的sign,需要urlencodetry {rsaSign = URLEncoder.encode(rsaSign,"UTF-8");} catch (UnsupportedEncodingException e) {rsaSign = null;}return rsaSign;}/*** 获取request body 的MD5* @param requestBody* @return*/private static String getRequestMd5(final String requestBody) {byte[] data;String newRequestBody = convertToUtf8(requestBody);try {data = newRequestBody.getBytes("UTF-8");}catch (UnsupportedEncodingException e) {throw new RuntimeException(e.getMessage(), e);}return md5(data);}/*** 计算参数RSA签名* @param privateKey* @param signData* @return*/private static String calcRsaSign(String privateKey, final String signData) {byte[] data;try {data = signData.getBytes("UTF-8");}catch (UnsupportedEncodingException e) {throw new RuntimeException(e.getMessage(), e);}byte[] sign = null;// 解密由base64编码的私钥byte[] privateKeyBytes = base64decode(privateKey.getBytes());// 构造PKCS8EncodedKeySpec对象PKCS8EncodedKeySpec pkcs8KeySpec = new PKCS8EncodedKeySpec(privateKeyBytes);// KEY_ALGORITHM 指定的加密算法KeyFactory keyFactory;try {keyFactory = KeyFactory.getInstance("RSA");}catch (NoSuchAlgorithmException e) {throw new RuntimeException(e.getMessage(), e);}// 取私钥匙对象PrivateKey priKey;try {priKey = keyFactory.generatePrivate(pkcs8KeySpec);}catch (InvalidKeySpecException e) {throw new RuntimeException(e.getMessage(), e);}// 用私钥对信息生成数字签名Signature signature;try {signature = Signature.getInstance("SHA1withRSA");}catch (NoSuchAlgorithmException e) {throw new RuntimeException(e.getMessage(), e);}try {signature.initSign(priKey);}catch (InvalidKeyException e) {throw new RuntimeException(e.getMessage(), e);}try {signature.update(data);sign = signature.sign();}catch (SignatureException e) {throw new RuntimeException(e.getMessage(), e);}return new String(base64encode(sign));}/*** 转换字符集到utf8** @param src* @return*/private static String convertToUtf8(String src) {if (src == null || src.length() == 0) {return src;}if ("UTF-8".equalsIgnoreCase(Charset.defaultCharset().name())) {return src;}byte[] srcData = src.getBytes();try {return new String(srcData, "UTF-8");}catch (UnsupportedEncodingException e) {throw new RuntimeException(e.getMessage(), e);}}/*** md5* @param data* @return*/public static String md5(byte[] data) {char hexDigits[]={'0','1','2','3','4','5','6','7','8','9','a','b','c','d','e','f'};byte[] btInput = data;// 获得MD5摘要算法的 MessageDigest 对象MessageDigest mdInst;try {mdInst = MessageDigest.getInstance("MD5");}catch (NoSuchAlgorithmException e) {throw new RuntimeException(e.getMessage(), e);}// 使用指定的字节更新摘要mdInst.update(btInput);// 获得密文byte[] md = mdInst.digest();// 把密文转换成十六进制的字符串形式int j = md.length;char str[] = new char[j * 2];int k = 0;for (int i = 0; i < j; i++) {byte byte0 = md[i];str[k++] = hexDigits[byte0 >>> 4 & 0xf];str[k++] = hexDigits[byte0 & 0xf];}return new String(str);}/*** base64编码* @param data* @return*/public static byte[] base64encode(byte[] data) {return Base64.encodeBase64(data);}/*** base64编码字符串* @param data* @return*/public static String base64encodeString(byte[] data) {return Base64.encodeBase64String(data);}/*** base64解码* @param data* @return*/public static byte[] base64decode(byte[] data) {try {return Base64.decodeBase64(data);} catch (Exception e) {ByteArrayOutputStream outputStream = new ByteArrayOutputStream();for (int i = 0; i < data.length; i++) {byte c = data[i];if (c == 13 || c == 10) {continue;}outputStream.write(c);}try {outputStream.close();} catch (IOException e2) {}data = outputStream.toByteArray();return Base64.decodeBase64(data);}}
}
RSA签名算法,计算调用加密报文,安全传输相关推荐
- RSA签名算法 - Java加密与安全
RSA签名算法在非对称加密中我们可以看到,甲乙双方要进行通信,用publicKey进行加密,用priavteKey解密,这个时候会出现一个问题,如果黑客用你的publicKey对消息进行加密,然后冒充 ...
- 5、隐私计算--同态加密
目录 同态加密 同态加密研究进展 同态加密原理及方案 同态加密分类 HE方案安全性 同态加密与区块链 同态加密应用 全同态工程实现开源工具 参考推荐: 同态加密_federated的博客-CSDN博客 ...
- 加密基础知识二 非对称加密RSA算法和对称加密
一.RSA的计算过程 上述过程中,出现了公钥(3233,17)和私钥(3233,2753),这两组数字是怎么找出来的呢?参考RSA算法原理(二) 首字母缩写说明:E是加密(Encryption)D是解 ...
- 数字签名系列一:签名简介与RSA签名算法
数字签名系列一 写在前面 数字签名作用 数字签名发展史 带属性的数字签名 RSA数字签名方案 写在前面 学了一年的数字签名方案,一直都在一个点进行专研,虽然还是有所收获,总感觉还差点感觉,上了一年研究 ...
- 基于RSA和AES混合加密实现的加解密小工具
基于RSA和AES混合加密实现的加解密小工具 闲来无事,用python的tkinter开发了一个基于RSA和AES混合加密的小小工具.总结一下使用到的知识点. 首先是核心的加解密部分. 采用混合加密的 ...
- python实现非对称加密算法_Python使用rsa模块实现非对称加密与解密
Python使用rsa模块实现非对称加密与解密 1.简单介绍: RSA加密算法是一种非对称加密算法 是由已知加密密钥推导出解密密钥在计算上是不可行的"密码体制.加密密钥(即公开密钥)PK是公 ...
- RSA(非对称)+AES(对称加密)前后台交互
前言: 为了提高安全性采用了RSA,但是为了解决RSA加解密性能问题,所以采用了RSA(非对称)+AES(对称加密)方式,如果只考虑其中一种的,可以去看我前面两篇文章,专门单独写的demo,可以 ...
- [crypto]-52-python3中rsa(签名验签加密解密)aes(ecb cbc ctr)hmac的使用,以及unittest测试用
环境: 在ubuntu14.04下,记得安装:sudo pip3 install pycrypto 代码示例1: =========================== import base64 f ...
- MyEclipse6.0 安装axis2插件, 调用加密的SAP webservice
MyEclipse6.0 安装axis2插件, 调用加密的SAP webservice 6人收藏此文章, 我要收藏 发表于1个月前(2013-06-06 09:41) , 已有116次阅读 ,共0个评 ...
最新文章
- 反射机制源码及原理学习
- hibernate 多对多(many-to-many)
- 读书笔记_Effective_C++_条款十九:设计class犹如设计type
- MadFS:高性能超算缓存文件系统——助力“鹏城云脑II”获世界IO500排行榜冠军...
- bracket 教程
- Oracle PL/SQL 存储过程
- Pycharm 安装 tensorflow 的一些坑
- 【读书笔记】之蔡康永的说话之道
- JavaScript中if嵌套
- jquery引入外部CDN,失效后则引入本地jq库
- 计算方法(五)函数插值
- 如何正确使用关键路径图?
- Eclipse中Ant的使用
- armv8 ARM64 AARCH64
- Aseprite入门教程
- 如何将QQ号设置成手机号?
- Unity3d 技巧(5) 了解VR 游戏开发 美术和资源规范
- 华为云大数据中台架构设计方案
- Mac 打开JD-GUI报错:ERROR launching ‘JD-GUI‘
- 利用Python实现MOOC扫码登录
热门文章
- 用Construct 2制作入门小游戏~
- trinosql_prestosql问题
- [实现] 利用 Seq2Seq 预测句子后续字词 (Pytorch)2
- TVM 高效保护隐私 ML
- Megengine量化
- 自动驾驶平台,阵营, 主要传感器与场景联系
- 2021年大数据Kafka(六):❤️安装Kafka-Eagle❤️
- Django 视图和模板1.4
- centos命令大全
- java.lang.NoSuchMethodError: No virtual method placeholder(I)Lcom/bumptech/