【Java加密解密算法世界】一、概述
实际工作中遇到的加密解密算法和算法之间的区别以及如何选择 , 包括:BASE64、DES、3DES、AES、RSA、MD5、SHA 。
区别与选择:
1. 加密算法可逆 , 用来保证数据安全 , 散列算法不可逆 , 用来验证身份 。
2. 对称加密算法 , 速度快 , 适合给大量数据加密 , 交互双方使用同一个密钥 , 存在被抓包破解的风险 。
3. 非对称加密算法使用公钥加密 , 私钥解密 , 私钥签名 , 公钥验签 , 安全性较高 , 但速度较慢 。非对称加密使用两个密钥 , 服务端和客户端密匙不一样 , 私钥放在服务端 , 安全性高 。4、在实际的操作过程中 , 我们通常采用的方式是:采用非对称加密算法管理对称算法的密钥 , 然后用对称加密算法加密数据 , 这样我们就集成了两类加密算法的优点 , 既实现了加密速度快的优点 , 又实现了安全方便管理密钥的优点 。
二、编码加解密
1、Base64:
说明:严格意义来说Base64并不是一种加密/解密算法 , 而是一种编码的方式 。Base64不生成密钥 , 通过Base64编码后的密文就可以直接“翻译”为明文 。在网络上传输数据时 , 往往要经过多个路由设备 , 由于不同的设备对字符的处理方式有一些不同 , 这样那些不可见字符就有可能被处理错误 , 这是不利于传输的 。所以就先把数据先做一个Base64编码 , 统统变成可见字符 , 这样出错的可能性就大降低 , Base64转换后的字符串理论上将要比原来的长1/3 。
例子:
package com.yx.encryption;import JAVA.util.Base64;/** * Base64使用例子 * 加密和解密 * * @author yx */public class Base64Demo {public static void main(String[] args) {// 加密文字String data = https://www.isolves.com/it/cxkf/sf/2021-07-30/"EasyJava";// 加密byte[] encode = Base64.getEncoder().encode(data.getBytes());String enCodeResult = new String(encode);System.out.println("加密结果:" + enCodeResult);// 解密byte[] decode = Base64.getDecoder().decode(enCodeResult);String decodeResult = new String(decode);System.out.println("解密结果:" + decodeResult);}}执行结果:加密结果:RWFzeUphdmE=解密结果:EasyJava
三、对称加解密
1、DES:
说明:DES是一种基于56位密钥的对称算法 , 1976年被美国联邦政府的国家标准局确定为联邦资料处理标准(FIPS) , 随后在国际上广泛流传开来 。现在DES已经不是一种安全的加密算法 , 已被公开破解 , 现在DES已经被高级加密标准(AES)所代替 。新项目不建议选择DES , 这种加密方式只存在历史项目中 。
例子:
package com.yx.encryption;import javax.crypto.Cipher;import javax.crypto.SecretKeyFactory;import javax.crypto.spec.DESKeySpec;import java.security.Key;/** * DES使用例子 * 加密和解密 * * @author yx */public class DESDemo {/*** 密钥*/private static String SECRET_KEY = "12345678";private static final char[] HEXES = {'0', '1', '2', '3','4', '5', '6', '7','8', '9', 'a', 'b','c', 'd', 'e', 'f'};/*** byte数组 转换成 16进制小写字符串*/public static String bytes2Hex(byte[] bytes) {if (bytes == null || bytes.length == 0) {return null;}StringBuilder hex = new StringBuilder();for (byte b : bytes) {hex.Append(HEXES[(b >> 4) & 0x0F]);hex.append(HEXES[b & 0x0F]);}return hex.toString();}public static void main(String[] args) throws Exception {// 加密字符串String src = https://www.isolves.com/it/cxkf/sf/2021-07-30/"EasyJava";//KEY转换DESKeySpec desKeySpec = new DESKeySpec(SECRET_KEY.getBytes("utf-8"));SecretKeyFactory factory = SecretKeyFactory.getInstance("DES");Key convertSecretKey = factory.generateSecret(desKeySpec);//加密Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");cipher.init(Cipher.ENCRYPT_MODE, convertSecretKey);byte[] result = cipher.doFinal(src.getBytes());System.out.println("加密结果: " + bytes2Hex(result));//解密cipher.init(Cipher.DECRYPT_MODE, convertSecretKey);result = cipher.doFinal(result);System.out.println("解密结果: " + new String(result));}}执行结果:加密结果: dcf185f57bb08208feb959b7d4642fcb解密结果: EasyJava
2、3DES
说明:相当于是对每个数据块应用三次DES加密算法 。由于计算机运算能力的增强 , 原版DES密码的密钥长度变得容易被暴力破解 , 3DES即是设计用来提供一种相对简单的方法 , 即通过增加DES的密钥长度来避免类似的攻击 , 而不是设计一种全新密码算法 。
推荐阅读
- 「Java原理探索」「AQS」教你自定义实现自己的同步器
- Java循环结构——switch语句
- Javascript 中New 操作符 解读
- 不仅限于Java 我们必须要了解的Java位运算
- 关于加密算法你了解多少
- 为什么我们总是推荐Java?Java为什么值得学?
- 学Java还是前端?我是这么看的
- Java开发环境搭建与配置,最全手册看这一篇就够了
- 彻底搞懂Java线程池的工作原理
- Java主要的5个标准注解如何使用?