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&param2=value2&param3=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签名算法,计算调用加密报文,安全传输相关推荐

  1. RSA签名算法 - Java加密与安全

    RSA签名算法在非对称加密中我们可以看到,甲乙双方要进行通信,用publicKey进行加密,用priavteKey解密,这个时候会出现一个问题,如果黑客用你的publicKey对消息进行加密,然后冒充 ...

  2. 5、隐私计算--同态加密

    目录 同态加密 同态加密研究进展 同态加密原理及方案 同态加密分类 HE方案安全性 同态加密与区块链 同态加密应用 全同态工程实现开源工具 参考推荐: 同态加密_federated的博客-CSDN博客 ...

  3. 加密基础知识二 非对称加密RSA算法和对称加密

    一.RSA的计算过程 上述过程中,出现了公钥(3233,17)和私钥(3233,2753),这两组数字是怎么找出来的呢?参考RSA算法原理(二) 首字母缩写说明:E是加密(Encryption)D是解 ...

  4. 数字签名系列一:签名简介与RSA签名算法

    数字签名系列一 写在前面 数字签名作用 数字签名发展史 带属性的数字签名 RSA数字签名方案 写在前面 学了一年的数字签名方案,一直都在一个点进行专研,虽然还是有所收获,总感觉还差点感觉,上了一年研究 ...

  5. 基于RSA和AES混合加密实现的加解密小工具

    基于RSA和AES混合加密实现的加解密小工具 闲来无事,用python的tkinter开发了一个基于RSA和AES混合加密的小小工具.总结一下使用到的知识点. 首先是核心的加解密部分. 采用混合加密的 ...

  6. python实现非对称加密算法_Python使用rsa模块实现非对称加密与解密

    Python使用rsa模块实现非对称加密与解密 1.简单介绍: RSA加密算法是一种非对称加密算法 是由已知加密密钥推导出解密密钥在计算上是不可行的"密码体制.加密密钥(即公开密钥)PK是公 ...

  7. RSA(非对称)+AES(对称加密)前后台交互

    前言:    为了提高安全性采用了RSA,但是为了解决RSA加解密性能问题,所以采用了RSA(非对称)+AES(对称加密)方式,如果只考虑其中一种的,可以去看我前面两篇文章,专门单独写的demo,可以 ...

  8. [crypto]-52-python3中rsa(签名验签加密解密)aes(ecb cbc ctr)hmac的使用,以及unittest测试用

    环境: 在ubuntu14.04下,记得安装:sudo pip3 install pycrypto 代码示例1: =========================== import base64 f ...

  9. MyEclipse6.0 安装axis2插件, 调用加密的SAP webservice

    MyEclipse6.0 安装axis2插件, 调用加密的SAP webservice 6人收藏此文章, 我要收藏 发表于1个月前(2013-06-06 09:41) , 已有116次阅读 ,共0个评 ...

最新文章

  1. 反射机制源码及原理学习
  2. hibernate 多对多(many-to-many)
  3. 读书笔记_Effective_C++_条款十九:设计class犹如设计type
  4. MadFS:高性能超算缓存文件系统——助力“鹏城云脑II”获世界IO500排行榜冠军...
  5. bracket 教程
  6. Oracle PL/SQL 存储过程
  7. Pycharm 安装 tensorflow 的一些坑
  8. 【读书笔记】之蔡康永的说话之道
  9. JavaScript中if嵌套
  10. jquery引入外部CDN,失效后则引入本地jq库
  11. 计算方法(五)函数插值
  12. 如何正确使用关键路径图?
  13. Eclipse中Ant的使用
  14. armv8 ARM64 AARCH64
  15. Aseprite入门教程
  16. 如何将QQ号设置成手机号?
  17. Unity3d 技巧(5) 了解VR 游戏开发 美术和资源规范
  18. 华为云大数据中台架构设计方案
  19. Mac 打开JD-GUI报错:ERROR launching ‘JD-GUI‘
  20. 利用Python实现MOOC扫码登录

热门文章

  1. 用Construct 2制作入门小游戏~
  2. trinosql_prestosql问题
  3. [实现] 利用 Seq2Seq 预测句子后续字词 (Pytorch)2
  4. TVM 高效保护隐私 ML
  5. Megengine量化
  6. 自动驾驶平台,阵营, 主要传感器与场景联系
  7. 2021年大数据Kafka(六):❤️安装Kafka-Eagle❤️
  8. Django 视图和模板1.4
  9. centos命令大全
  10. java.lang.NoSuchMethodError: No virtual method placeholder(I)Lcom/bumptech/