一般金融类的产品,涉及前端和后端交互的时候,都会都严格的数据安全保证。防止黑客攻击,信息篡改。

加密方式有很多,总的来说,分为2种:对称和非对称。我们先来看一下,这两种加密方式分别是什么?他们有什么区别?

对称加密:

对称加密,即采用对称的密码编码技术,他的特点是,加密和解密使用相同的秘钥。

常见的对称加密算法有DES、3DES、Blowfish、IDEA、RC4、RC5、RC6和AES。对称加密算法使用起来简单快捷,密钥较短,且破译困难。

但是对称秘钥在使用过程中存在以下问题:

1、对称加密算法一般不能提供信息完整性的鉴别。它无法验证发送者和接受者的身份;

2、对称密钥的管理和分发工作是一件具有潜在危险的和烦琐的过程。如何防止秘钥泄露是一个难点。

非对称加密:

非对称加密技术,需要两个秘钥,公钥和私钥。公钥和私钥成对出现。

如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。

非对称加密算法实现机密信息交换的基本过程是:甲方生成一对密钥并将其中的一把作为公用密钥向其它方公开;得到该公用密钥的乙方使用该密钥对机密信息进行加密后再发送给甲方;甲方再用自己保存的另一把专用密钥对加密后的信息进行解密。甲方只能用其专用密钥解密由其公用密钥加密后的任何信息。

非对称加密的典型应用是数字签名。

常见的非对称加密算法有:RSA、ECC(移动设备用)、Diffie-Hellman、El Gamal、DSA(数字签名用)。

对称+非对称:

现在,我们已经对对称和非对称加密有了一定的了解。接下来,我将会给大家介绍一下,我在项目中使用的一种加密方式:对称+非对称。

先看一张流程图:

先看发送方:

这里,我们主要有2步操作。

1、报文原文使用对称加密技术。对称加密的秘钥(避免混淆,这里称对称密码)。根据随机数生成。每次发起请求时,会重新产生一个随机数,进一步降低被破解的风险。

2、对称密码通过非对称加密方式进行加密。公钥由后台产生,匹配的私钥由后台保管。这样产生一个加密后的对称密码。前端在发送给后端之后,后端需要用匹配的私钥才能解开。

再看接收方:

接收方在接收到数据包之后,同样有两步操作:

1、会使用匹配的私钥解密加密的对称密码,获取到真实的对称密码。

2、使用对称密码,解密加密报文,获取原报文内容。

这样做的好处是:

1、因为我们的对称密码是使用非对称加密的,因此,想要破解,需要找到相应的公钥才行。

2、每次请求会重新生成一个对称密码,这就加大了破解的难度。

代码实现:

工具类:

非对称加密:

public class RSA1 {/*** 随机生成公钥和私钥*/public static final String publicKeyString  = "publicKeyString";public static final String privateKeyString = "privateKeyString";public static HashMap<String, String> getRandomKey() throws NoSuchAlgorithmException, InvalidKeySpecException {KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");keyPairGen.initialize(1024);//生成大小 1024KeyPair keyPair = keyPairGen.generateKeyPair();RSAPublicKey publicKey = (RSAPublicKey) keyPair.getPublic();//获取公钥RSAPrivateKey privateKey = (RSAPrivateKey) keyPair.getPrivate();//获取私钥HashMap<String, String> keyMap = new HashMap<String, String>();keyMap.put(publicKeyString, new String(Base64.encode(publicKey.getEncoded(), Base64.DEFAULT)));//获取公钥Base64编码keyMap.put(privateKeyString, new String(Base64.encode(privateKey.getEncoded(), Base64.DEFAULT)));//获取密钥Base64编码return keyMap;}/*** 通过字符串生成私钥*/public static PrivateKey getPrivateKey(String privateKeyData) {PrivateKey privateKey = null;try {byte[] decodeKey = Base64.decode(privateKeyData, Base64.DEFAULT); //将字符串Base64解码PKCS8EncodedKeySpec x509 = new PKCS8EncodedKeySpec(decodeKey);//创建x509证书封装类KeyFactory keyFactory = KeyFactory.getInstance("RSA");//指定RSAprivateKey = keyFactory.generatePrivate(x509);//生成私钥} catch (NoSuchAlgorithmException e) {e.printStackTrace();} catch (InvalidKeySpecException e) {e.printStackTrace();}return privateKey;}/*** 通过字符串生成公钥*/public static PublicKey getPublicKey(String publicKeyData) {PublicKey publicKey = null;try {byte[] decodeKey = Base64.decode(publicKeyData, Base64.DEFAULT);X509EncodedKeySpec x509 = new X509EncodedKeySpec(decodeKey);KeyFactory keyFactory = KeyFactory.getInstance("RSA");publicKey = keyFactory.generatePublic(x509);} catch (NoSuchAlgorithmException e) {e.printStackTrace();} catch (InvalidKeySpecException e) {e.printStackTrace();}return publicKey;}/*** 加密*/public static byte[] encrypt(String data, Key key) {try {//取公钥KeyFactory keyFactory = KeyFactory.getInstance("RSA");Cipher cipher = Cipher.getInstance(keyFactory.getAlgorithm(),"BC");cipher.init(Cipher.ENCRYPT_MODE, key);return cipher.doFinal(data.getBytes());} catch (Exception e) {e.printStackTrace();}return null;}/*** 解密*/public static byte[] decrypt(byte[] data, Key key) {try {Cipher cipher = Cipher.getInstance("RSA","BC");cipher.init(Cipher.DECRYPT_MODE, key);return cipher.doFinal(data);} catch (Exception e) {e.printStackTrace();}return null;}
}

对称加密:

public class AES_2 {public static byte[] genPrivateKey(String password) throws NoSuchAlgorithmException {KeyGenerator kgen = KeyGenerator.getInstance("AES");byte[] bytes = tohash256Deal(password);SecureRandom securerandom = new SecureRandom(bytes);kgen.init(128, securerandom);SecretKey secretKey = kgen.generateKey();byte[] enCodeFormat = secretKey.getEncoded();SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");return key.getEncoded();}public static byte[] encrypt(String content, SecretKeySpec key) {try {//创建一个实现指定转换的 Cipher对象,该转换由指定的提供程序提供。Cipher cipher = Cipher.getInstance("AES/ECB/PKCS7Padding");cipher.init(Cipher.ENCRYPT_MODE, key);byte[] byteContent = content.getBytes("utf-8");byte[] cryptograph = cipher.doFinal(byteContent);return Base64.encode(cryptograph, Base64.DEFAULT);} catch (Exception e) {e.printStackTrace();}return null;}public static String decrypt(byte[] cryptograph, SecretKeySpec key) {try {Cipher cipher = Cipher.getInstance("AES/ECB/PKCS7Padding");cipher.init(Cipher.DECRYPT_MODE, key);byte[] content = cipher.doFinal(Base64.decode(cryptograph, Base64.DEFAULT));return new String(content);} catch (Exception e) {e.printStackTrace();}return null;}public static byte[] encrypt(String content, String password) {try {//"AES":请求的密钥算法的标准名称KeyGenerator kgen = KeyGenerator.getInstance("AES");//256:密钥生成参数;securerandom:密钥生成器的随机源SecureRandom securerandom = new SecureRandom(tohash256Deal(password));kgen.init(128, securerandom);//生成秘密(对称)密钥SecretKey secretKey = kgen.generateKey();//返回基本编码格式的密钥byte[] enCodeFormat = secretKey.getEncoded();//根据给定的字节数组构造一个密钥。enCodeFormat:密钥内容;"AES":与给定的密钥内容相关联的密钥算法的名称SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");//将提供程序添加到下一个可用位置Security.addProvider(new BouncyCastleProvider());//创建一个实现指定转换的 Cipher对象,该转换由指定的提供程序提供。//"AES/ECB/PKCS7Padding":转换的名称;"BC":提供程序的名称Cipher cipher = Cipher.getInstance("AES/ECB/PKCS7Padding", "BC");cipher.init(Cipher.ENCRYPT_MODE, key);byte[] byteContent = content.getBytes("utf-8");byte[] cryptograph = cipher.doFinal(byteContent);return Base64.encode(cryptograph, Base64.DEFAULT);} catch (Exception e) {e.printStackTrace();}return null;}public static String decrypt(byte[] cryptograph, String password) {try {KeyGenerator kgen = KeyGenerator.getInstance("AES");SecureRandom securerandom = new SecureRandom(tohash256Deal(password));kgen.init(128, securerandom);SecretKey secretKey = kgen.generateKey();byte[] enCodeFormat = secretKey.getEncoded();SecretKeySpec key = new SecretKeySpec(enCodeFormat, "AES");Security.addProvider(new BouncyCastleProvider());Cipher cipher = Cipher.getInstance("AES/ECB/PKCS7Padding", "BC");cipher.init(Cipher.DECRYPT_MODE, key);byte[] content = cipher.doFinal(Base64.decode(cryptograph, Base64.DEFAULT));return new String(content);} catch (Exception e) {e.printStackTrace();}return null;}public static String parseByte2HexStr(byte buf[]) {StringBuffer sb = new StringBuffer();for (int i = 0; i < buf.length; i++) {String hex = Integer.toHexString(buf[i] & 0xFF);if (hex.length() == 1) {hex = '0' + hex;}sb.append(hex.toUpperCase());}return sb.toString();}public static byte[] parseHexStr2Byte(String hexStr) {if (hexStr.length() < 1)return null;byte[] result = new byte[hexStr.length() / 2];for (int i = 0; i < hexStr.length() / 2; i++) {int high = Integer.parseInt(hexStr.substring(i * 2, i * 2 + 1), 16);int low = Integer.parseInt(hexStr.substring(i * 2 + 1, i * 2 + 2), 16);result[i] = (byte) (high * 16 + low);}return result;}public static byte[] tohash256Deal(String datastr) {try {MessageDigest digester = MessageDigest.getInstance("SHA-256");digester.update(datastr.getBytes());byte[] hex = digester.digest();return hex;} catch (NoSuchAlgorithmException e) {throw new RuntimeException(e.getMessage());}}}  

发送方和接收方的实现:

        String content = "000";JSONObject jsonObject = new JSONObject();try {LogT.i("++++++++++++++++++++++发送方+++++++++++++++++++++++++=");//产生私钥int random = (int) ((Math.random() * 9 + 1) * 100000);//私钥字节byte[] bytes = AES_2.genPrivateKey(String.valueOf(random));//传输报文加密SecretKeySpec key1 = new SecretKeySpec(bytes, "AES");byte[] content_encrypt = AES_2.encrypt(content, key1);//公钥对私钥加密PublicKey publicKey = RSA1.getPublicKey(public_key);sKey_encrypt = RSA1.encrypt(Base64.encodeToString(bytes, Base64.DEFAULT), publicKey);//数据组装jsonObject.put("key", Base64.encodeToString(sKey_encrypt, Base64.DEFAULT));jsonObject.put("content", AES_2.parseByte2HexStr(content_encrypt));LogT.i("+++++++++++++++++++++++接收方++++++++++++++++++++++++=");//解析获取私钥PrivateKey privateKey = RSA1.getPrivateKey(private_key);//解析接收到的key数据byte[] decode = Base64.decode(Base64.encodeToString(sKey_encrypt, Base64.DEFAULT), Base64.DEFAULT);//私钥解密byte[] decrypt = RSA1.decrypt(decode, privateKey);//解码私钥字节byte[] decode_orig = Base64.decode(new String(decrypt), Base64.DEFAULT);//加密的报文byte[] HexStrByte = AES_2.parseHexStr2Byte(AES_2.parseByte2HexStr(content_encrypt));SecretKeySpec key2 = new SecretKeySpec(decode_orig, "AES");//解密后的报文String decrypt1 = AES_2.decrypt(HexStrByte, key2);LogT.i(decrypt1);//000} catch (Exception e) {e.printStackTrace();}

扫码关注,共同进步

对称加密+非对称加密,实现数据安全传输相关推荐

  1. Linux加密和安全篇(一)gpg、对称和非对称加密、哈希算法

    对于linux运维工作者而言,加密技术已经很早就用于数据的存储和数据之间的交换.我们可以会为了防止你的网站.服务器或者系统,我们会使用一些手段来防止一些恶意的攻击或者访问.一下就对linux的安全和加 ...

  2. 隐私计算加密技术基础系列(下)对称与非对称加密的应用场景

    本章是<隐私计算加密技术基础>系列文章的最后一篇,感慨下,终于写完了,这个春节假期除了陪家人就是写着三篇文章了.其实写之前并没有觉得是多么难的事情,感觉这些原理自己都比较清楚,但是随着写的 ...

  3. 网络知识详解之:HTTPS通信原理剖析(对称、非对称加密、数字签名、数字证书)

    网络知识详解之:HTTPS通信原理剖析(对称.非对称加密.数字签名.数字证书) 计算机网络相关知识体系详解 网络知识详解之:TCP连接原理详解 网络知识详解之:HTTP协议基础 网络知识详解之:HTT ...

  4. HTTPS(对称加密+非对称加密+证书)

    目录 1. 加密和解密 HTTPS工作过程 2. 对称加密 3. 对称加密 4. 既然都有非对称加密了,那为啥还要有对称加密 5. 中间人攻击 6. 引入证书 HTTPS 也是一个应用层协议. 是在 ...

  5. 对称加密非对称加密混合加密

    对称加密&非对称加密&混合加密 写于前 iOS中常在哪些场景应用到 写一个系列 本文概要 对称加密(Symmetric Cryptography) 非对称加密(ASymmetric C ...

  6. 对称加密 非对称加密

    目录 一.加解密算法 二.算法体系 三.对称加密 四.非对称加密 五.混合加密机制 六.DES加密原理 七.3DES加密原理 八.AES加密原理 九.RSA加密原理 十.EIGamal加密原理 十一. ...

  7. Linux系统安全概述-sudo授权-pam认证机制-对称加密-非对称加密-md5-数字证书

    内容: 17.1 Linux系统安全概述-su-sudo授权 17.2 pam认证机制概述 17.3 对称加密-非对称加密方法 17.4 md5-sha1-哈希算法使用方法 17.5 CA证书的作用 ...

  8. 对称加密非对称加密怎么一起使用(初级版)

    对称加密 加密和解密使用相同的密钥,使用一把钥匙,所以叫对称加密,对称 加密包括多种算法,如:DES,3DES,AES 加密长度一般小于256位,防止数据被泄. 优点:加密和解密的速度快.缺点:因为使 ...

  9. 在线支付系列【3】支付安全之对称和非对称加密

    有道无术,术尚可求,有术无道,止于术. 文章目录 前言 信息安全 加密机制 核心概念 对称加密 非对称加密 JCE 对称加解密 1. 创建密钥 2. 加密 3. 解密 非对称加解密 1. 创建密钥 2 ...

  10. 非对称加密 密码传输_密码学:对称与非对称加密

    非对称加密 密码传输 Before the modern age of cryptography, where the focus has expanded from the confidential ...

最新文章

  1. python学习--基础
  2. KMP中next数组的理解
  3. boost::safe_numerics::cpp相关的测试程序
  4. java(1)——用notepad++编译java(javac.exe)
  5. Date类的构造方法和成员方法
  6. 人工智能过于发达可能将后患无穷
  7. 通读AFN①--从创建manager到数据解析完毕
  8. 任意门怎么用团发_平开门、推拉门都out了!衣柜门这样设计,实用方便又大气!...
  9. 图解HTTP知识框架
  10. C/C++网络编程工作笔记0002---网络编程流程
  11. codeforces 665A Buses Between Cities
  12. python模块基础之OS模块
  13. Python实现WGS 84坐标与web墨卡托投影坐标的转换
  14. python数字图像处理(15):霍夫线变换
  15. 设计模式-GRASP V.S GoF
  16. 工业界和学术界最大区别是什么?
  17. rabbitmq操作报错
  18. opencv4.1无法加载python-cnn模型,编译第三方库libtensorflow_cc.so巨坑
  19. TIME_WAIT状态存在的意义
  20. 推挽输出与开漏输出的区别

热门文章

  1. oracle 并行之二: parallel dml
  2. [极客大挑战 2019]Http 1(修改HTTP请求包)
  3. CentOS7离线安装Cloudera Manager 5.14.1
  4. 采购精英的行为准则(精典)
  5. Usage of API documented as @since 1.8+”报错的解决办法
  6. mysql实现跨服务器查询数据
  7. 《程序员》8月:移动开发新技术探索
  8. 漆翔宇计算机学院浙江大学,浙江大学20172018学年大学生学科竞赛获奖清单.pdf
  9. Android——实现Home键功能
  10. 数据分析~matlab plot 坐标、字体、子图