代码地址如下:
http://www.demodashi.com/demo/14000.html

一、概述

1、 数字签名的作用:保证数据完整性,机密性和发送方角色的不可抵赖性,加密与签字结合时,两套公私钥是不同的。

2、加密是对信息进行编码和解码的技术,编码是把原来可读信息(又称明文)译成代码形式(又称密文),其逆过程就是解码(解密),加密技术的要点是加密算法,加密算法可以分为三类: .对称加密 ,非对称加密 ,不可逆加密。

3、对称加密算法

a、加密过程: 将明文分成N个组,然后对各个组进行加密,形成各自的密文,最后把所有的分组密文进行合并,形成最终的密文。

b、优点: 算法公开、计算量小、加密速度快、加密效率高

c、缺点: 交易双方都使用同样钥匙,安全性得不到保证,密钥管理困难,尤其是在分布式网络中

d、常用算法: DES、3DES(TripleDES)、AES、RC2、RC4、RC5和Blowfish

4、非对称加密算法

a、使用过程: 乙方生成两把密钥(公钥和私钥),甲方获取乙方的公钥,然后用它对信息加密。乙方得到加密后的信息,用私钥解密,乙方也可用私钥加密字符串,甲方获取乙方私钥加密数据,用公钥解密。

b、优点: 更安全,密钥越长,它就越难破解

c、缺点: 加密速度慢

d、常用算法: RSA、Elgamal、背包算法、Rabin、D-H、ECC(椭圆曲线加密算法)

二、签名详细

签名方法:

public static String sign(String content, String privateKey, String input_charset){try {PKCS8EncodedKeySpec priPKCS8    = new PKCS8EncodedKeySpec( Base64.decode(privateKey) ); KeyFactory keyf                 = KeyFactory.getInstance("RSA");PrivateKey priKey               = keyf.generatePrivate(priPKCS8);java.security.Signature signature = java.security.Signature.getInstance(SIGN_ALGORITHMS);signature.initSign(priKey);signature.update( content.getBytes(input_charset) );byte[] signed = signature.sign();return Base64.encode(signed);}catch (Exception e) {e.printStackTrace();}return null;}

验证签名方法

public static boolean verify(String content, String sign, String ali_public_key, String input_charset){try {KeyFactory keyFactory = KeyFactory.getInstance("RSA");byte[] encodedKey = Base64.decode(ali_public_key);PublicKey pubKey = keyFactory.generatePublic(new X509EncodedKeySpec(encodedKey));java.security.Signature signature = java.security.Signature.getInstance(SIGN_ALGORITHMS);signature.initVerify(pubKey);signature.update( content.getBytes(input_charset) );boolean bverify = signature.verify( Base64.decode(sign) );return bverify;} catch (Exception e) {e.printStackTrace();}return false;}

三、加密详细

公钥加密

public static byte[] encryptByPublicKey(byte[] data, String key)throws Exception{// 对公钥解密byte[] keyBytes = decryptBASE64(key);// 取公钥X509EncodedKeySpec x509EncodedKeySpec = new X509EncodedKeySpec(keyBytes);KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORTHM);Key publicKey = keyFactory.generatePublic(x509EncodedKeySpec);// 对数据解密Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());cipher.init(Cipher.ENCRYPT_MODE, publicKey);int length = data.length;byte[] enBytes = null;for (int i = 0; i < length; i += 64){byte[] doFinal = cipher.doFinal(ArrayUtils.subarray(data, i, i + 64));enBytes = ArrayUtils.addAll(enBytes, doFinal);}return enBytes;}

私钥解密

public static byte[] decryptByPrivateKey(byte[] data, String key)throws Exception{// 对私钥解密byte[] keyBytes = decryptBASE64(key);PKCS8EncodedKeySpec pkcs8EncodedKeySpec = new PKCS8EncodedKeySpec(keyBytes);KeyFactory keyFactory = KeyFactory.getInstance(KEY_ALGORTHM);Key privateKey = keyFactory.generatePrivate(pkcs8EncodedKeySpec);// 对数据解密Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm());cipher.init(Cipher.DECRYPT_MODE, privateKey);byte[] deBytes = null;int length = data.length;for (int i = 0; i < length; i += 128){byte[] doFinal = cipher.doFinal(ArrayUtils.subarray(data, i,i + 128));deBytes = ArrayUtils.addAll(deBytes, doFinal);}return deBytes;}

运行结果图:

项目结构图:

其他

如果使用了https,是否还需要对接口进行rsa加密或者签名?
https 防止中间人攻击, rsa验证身份。 缺一不可。比如支付宝的订单接口 https,谁都可以调用, 但是用你的rsa私钥签名是告诉支付宝:“这是我调用的”,当支付宝调用你的接口,通知你支付宝状态的时候, 也会用它的私钥签名 告诉你“这的确是来着支付宝的请求”,这样才能说明这个订单 是真真实实成功的。

JSON 接口如何实现 RSA 非对称加密与签名

代码地址如下:
http://www.demodashi.com/demo/14000.html

注:本文著作权归作者,由demo大师代发,拒绝转载,转载需要作者授权

JSON 接口如何实现 RSA 非对称加密与签名相关推荐

  1. java集成RSA非对称加密数据传输

    使用场景: 前端请求后端接口时如:登录接口,这时候需要传账号密码到后端接口请求这样就会暴露请求的数据.RSA非对称加密分公钥和私钥,公钥将数据进行加密,私钥对加密的数据进行解密 (当然前端最好是封装一 ...

  2. CryptoAPI与openssl RSA非对称加密解密(PKCS1 PADDING)交互

    (以下代码中都只做测试用,有些地方没有释放内存...这个自己解决下) 1.RSA非对称的,首先提供一个供测试用的证书和私钥的数据 1)pem格式的证书和私钥(公私钥是对应的)的base64编码 [cp ...

  3. php利用openssl实现RSA非对称加密签名

    来源:http://www.webiji.com/archives/412 php利用openssl实现RSA非对称加密签名 1. 先用php生成一对公钥和私钥 $res = openssl_pkey ...

  4. Atitit RSA非对称加密原理与解决方案

    Atitit RSA非对称加密原理与解决方案 1.1. 一.一点历史 1 1.2. 八.加密和解密 2 1.3. 二.基于RSA的消息传递机制  3 1.4. 基于rsa的授权验证机器码 4 1.5. ...

  5. java rsa 117_java实现RSA非对称加密解密

    之前写过一篇java实现AES对称加密解密 在对密码加密传输的场景下 RSA非对称加密解密可能会更加适合. 原理就是后台生成一对公钥和私钥,公钥给前端用来加密,后台用私钥去解密,保证了传输过程中就算被 ...

  6. 前后端数据加密传输 RSA非对称加密

    任务需求:要求登陆时将密码加密之后再进行传输到后端. 经过半天查询摸索折腾,于是有了如下成果: 加密方式:RSA非对称加密. 实现方式:公钥加密,私钥解密. 研究进度:javascript与java端 ...

  7. Springboot+RSA非对称加密

    这是百度百科对(对称加密丶非对称加密)的解释: (1)对称加密算法在加密和解密时使用的是同一个秘钥. (2)非对称加密算法需要两个密钥来进行加密和解密,这两个秘钥是公开密钥(public key,简称 ...

  8. 微信小程序RSA非对称加密。

    因公司做的产品为金融项目,所以对数据安全性有很高要求,因为项目中的数据都会通过3DES 对称加密,和RSA非对称加密进行数据传输. 在这里先简单介绍一下什么是对称加密和非对称加密 对称加密:对称加密采 ...

  9. 数据加密 RSA非对称加密篇

    先把代码贴上来,理论后续补充,暂时可先参考数据加密 总篇 package com.jlpay.partner.utils;import android.util.Base64;import java. ...

最新文章

  1. Android Intent setAction的使用注意
  2. usaco前两章小结
  3. Eclipse使用技巧收集
  4. 编码最佳实践——Liskov替换原则
  5. ACM/OI中C++常用优化(实用/调试/技巧)代码(语法)
  6. Sqlite SQL格式化输入函数splite3_mprintf
  7. 详解两阶段3D目标检测网络 Voxel R-CNN:Towards High Performance Voxel-based 3D Object Detection
  8. 2020江苏计算机二级考试官网,2020年秋季江苏省计算机等级考试报名通知
  9. 把iconfront的资源放cdn访问_详解mpvue小程序中怎么引入iconfont字体图标
  10. Java ArrayList contains()方法及示例
  11. MySQL高级-SQL优化
  12. Ubuntu 11.10 快捷键 gnome gFTP 服务器 vsftpd 程序 面板
  13. Android现学现用第十二天
  14. 使用二维码识别技术的好处_二维码门禁系统,是如何实现解密开锁的呢?
  15. vue无法加载ps1
  16. 804计算机考研,北京邮电大学804信号系统考研经验
  17. dhcp服务器在作用,dhcp的作用是什么?dhcp优缺点
  18. Codeforces 407C--Curious Array
  19. Ubuntu16.04 笔记本合上盖子时不进入休眠
  20. SAS EM之SAS Credit Scoring不能使用

热门文章

  1. php 函数返回多个值
  2. 英文语句处理(空格处理)
  3. 杭电多校第六场-J-Ridiculous Netizens
  4. 【转】The Google File System 中文版
  5. BZOJ4129: Haruna’s Breakfast
  6. codeforces 450B. Jzzhu and Sequences 解题报告
  7. spring+springmvc+ibatis整合小结
  8. [原创]按键小精灵9通用去广告破解补丁
  9. BAT教程 第三节(FOR命令中的变量)
  10. 编写了一个通过手机短信平台收发短信的软件