参考:
https://blog.csdn.net/qq_41570658/article/details/107694782
https://blog.csdn.net/qq_30054961/article/details/82456069
https://www.html.cn/qa/other/21683.html

一、MD5加密

1、使用spirng自带MD5进行加密

// secureRandom是比Random安全的随机数
SecureRandom sr1 = new SecureRandom();
// 生成6位随机数,sr1.nextInt(900000)是生成900000以内的随机数
String salt = String.valueOf(sr1.nextInt(900000) + 100000);
// spring自带的md5加密,加入随机盐,使得密文不重复,记得把盐保存到用户表中
System.out.println(DigestUtils.md5DigestAsHex(("swp123"+salt).getBytes()));

二、对称加密

采用单钥密码系统的加密方法,同一个密钥可以同时用作信息的加密和解密,这种加密方法称为对称加密,也称为单密钥加密。

1、DES
已破解,不再安全,基本没有企业在用了
是对称加密算法的基石,具有学习价值
密钥长度56(JDK)、56/64(BC)
2、DESede(三重DES)
早于AES出现来替代DES
计算密钥时间太长、加密效率不高,所以也基本上不用
密钥长度112/168(JDK)、128/192(BC)
3、AES
最常用的对称加密算法
密钥建立时间短、灵敏性好、内存需求低(不管怎样,反正就是好)
实际使用中,使用工作模式为CTR(最好用BC去实现),此工作模式需要引入IV参数(16位的字节数组)
密钥长度128/192/256,其中192与256需要配置无政策限制权限文件(JDK6)
填充模式最常用的两种PKCS5Padding和PKCS7Padding,其中后者只有BC独有。

1、AES加解密

package com.example.demo.config;import com.alibaba.fastjson.JSONObject;
import org.apache.commons.codec.binary.Base64;import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.spec.SecretKeySpec;
import java.util.HashMap;
import java.util.Map;/*** @Filename: ASEUtils* @Author: sheng* <li>Date: 2022/3/9 10:24</li>* <li>Version: 1.0</li>* <li>Content: create</li>*/
public class ASEUtils {// 长度为16字节 ,自己定义(采用密钥长度128位,所以是16字节)private static final String KEY = "xxxxxxxxxxxxxxxx";//参数分别代表 算法名称/加密模式/数据填充方式private static final String ALGORITHMSTR = "AES/ECB/PKCS5Padding";/*** 加密** @param content    加密的字符串* @param encryptKey key值* @return* @throws Exception*/public static String encrypt(String content, String encryptKey) throws Exception {KeyGenerator kgen = KeyGenerator.getInstance("AES");kgen.init(128);Cipher cipher = Cipher.getInstance(ALGORITHMSTR);cipher.init(Cipher.ENCRYPT_MODE, new SecretKeySpec(encryptKey.getBytes(), "AES"));byte[] b = cipher.doFinal(content.getBytes("utf-8"));// 采用base64算法进行转码,避免出现中文乱码return Base64.encodeBase64String(b);}/*** 解密** @param encryptStr 解密的字符串* @param decryptKey 解密的key值* @return* @throws Exception*/public static String decrypt(String encryptStr, String decryptKey) throws Exception {KeyGenerator kgen = KeyGenerator.getInstance("AES");kgen.init(128);Cipher cipher = Cipher.getInstance(ALGORITHMSTR);cipher.init(Cipher.DECRYPT_MODE, new SecretKeySpec(decryptKey.getBytes(), "AES"));// 采用base64算法进行转码,避免出现中文乱码byte[] encryptBytes = Base64.decodeBase64(encryptStr);byte[] decryptBytes = cipher.doFinal(encryptBytes);return new String(decryptBytes);}public static String encrypt(String content) throws Exception {return encrypt(content, KEY);}public static String decrypt(String encryptStr) throws Exception {return decrypt(encryptStr, KEY);}public static void main(String[] args) throws Exception {Map map = new HashMap<String, String>();map.put("key", "value");map.put("中文", "汉字");String content = JSONObject.toJSONString(map);System.out.println("加密前:" + content);String encrypt = encrypt(content, KEY);System.out.println("加密后:" + encrypt);String decrypt = decrypt(encrypt, KEY);System.out.println("解密后:" + decrypt);}
}

三、非对称加密

非对称加密算法需要两个密钥:公开密钥(publickey:简称公钥)和私有密钥(privatekey:简称私钥)。公钥与私钥是一对,如果用公钥对数据进行加密,只有用对应的私钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。非对称加密常用的是RSA

1、RSA加解密

package com.example.demo.config;import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.security.Key;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.SecureRandom;
import javax.crypto.Cipher;/*** @Filename: ASEUtils* @Author: sheng* <li>Date: 2022/3/9 10:24</li>* <li>Version: 1.0</li>* <li>Content: create</li>*/
public class RSAUtils {/** 指定加密算法为DESede */private static String ALGORITHM = "RSA";/** 指定key的大小 */private static int KEYSIZE = 1024;/** 指定公钥存放文件 */private static String PUBLIC_KEY_FILE = "public.keystore";/** 指定私钥存放文件 */private static String PRIVATE_KEY_FILE = "private.keystore";/*** 生成密钥对*/private static void generateKeyPair() throws Exception {/** RSA算法要求有一个可信任的随机数源 */SecureRandom sr = new SecureRandom();/** 为RSA算法创建一个KeyPairGenerator对象 */KeyPairGenerator kpg = KeyPairGenerator.getInstance(ALGORITHM);/** 利用上面的随机数据源初始化这个KeyPairGenerator对象 */kpg.initialize(KEYSIZE, sr);/** 生成密匙对 */KeyPair kp = kpg.generateKeyPair();/** 得到公钥 */Key publicKey = kp.getPublic();/** 得到私钥 */Key privateKey = kp.getPrivate();/** 用对象流将生成的密钥写入文件 */ObjectOutputStream oos1 = new ObjectOutputStream(new FileOutputStream(PUBLIC_KEY_FILE));ObjectOutputStream oos2 = new ObjectOutputStream(new FileOutputStream(PRIVATE_KEY_FILE));oos1.writeObject(publicKey);oos2.writeObject(privateKey);/** 清空缓存,关闭文件输出流 */oos1.close();oos2.close();}/*** 加密方法 source: 源数据*/public static String encrypt(String source) throws Exception {generateKeyPair();/** 将文件中的公钥对象读出 */ObjectInputStream ois = new ObjectInputStream(new FileInputStream(PUBLIC_KEY_FILE));Key key = (Key) ois.readObject();ois.close();/** 得到Cipher对象来实现对源数据的RSA加密 */Cipher cipher = Cipher.getInstance(ALGORITHM);cipher.init(Cipher.ENCRYPT_MODE, key);byte[] b = source.getBytes();/** 执行加密操作 */byte[] b1 = cipher.doFinal(b);BASE64Encoder encoder = new BASE64Encoder();return encoder.encode(b1);}/*** 解密算法 cryptograph:密文*/public static String decrypt(String cryptograph) throws Exception {/** 将文件中的私钥对象读出 */ObjectInputStream ois = new ObjectInputStream(new FileInputStream(PRIVATE_KEY_FILE));Key key = (Key) ois.readObject();/** 得到Cipher对象对已用公钥加密的数据进行RSA解密 */Cipher cipher = Cipher.getInstance(ALGORITHM);cipher.init(Cipher.DECRYPT_MODE, key);BASE64Decoder decoder = new BASE64Decoder();byte[] b1 = decoder.decodeBuffer(cryptograph);/** 执行解密操作 */byte[] b = cipher.doFinal(b1);return new String(b);}public static void main(String[] args) throws Exception {String source = "非对称加密RSA";// 要加密的字符串System.out.println("加密前--->" +source);String cryptograph = encrypt(source);// 生成的密文System.out.println("加密后--->" +cryptograph);String target = decrypt(cryptograph);// 解密密文System.out.println("解密后--->" + target);}}

四、Base64编码

Base 64 Encoding有什么用?举个简单的例子,你使用SMTP协议 (Simple Mail Transfer Protocol 简单邮件传输协议)来发送邮件。因为这个协议是基于文本的协议,所以如果邮件中包含一幅图片,我们知道图片的存储格式是二进制数据(binary data),而非文本格式,我们必须将二进制的数据编码成文本格式,这时候Base 64 Encoding就派上用场了。

public void testJDKBase64(){String encoderStr = java.util.Base64.getEncoder().encodeToString(s.getBytes());System.out.println("encode :"+encoderStr);String decodeStr = new String(java.util.Base64.getDecoder().decode(encoderStr));System.out.println("decodeStr :"+decodeStr);
}public void testCodecBase64(){String encoderStr = org.apache.commons.codec.binary.Base64.encodeBase64String(s.getBytes());System.out.println("encode :"+encoderStr);String decodeStr = new String(org.apache.commons.codec.binary.Base64.decodeBase64(encoderStr));System.out.println("decodeStr :"+decodeStr);
}

五、应用场景

  1. Base64应用场景:图片转码(应用于邮件,img标签,http加密)
  2. MD5应用场景:密码加密、imei加密、文件校验
  3. 非对称加密:电商订单付款、银行相关业务

常用的加密有哪些?在Java中如何实现?(MD5、AES、RSA)相关推荐

  1. JAVA中获取文件MD5值的四种方法

    JAVA中获取文件MD5值的四种方法其实都很类似,因为核心都是通过JAVA自带的MessageDigest类来实现.获取文件MD5值主要分为三个步骤,第一步获取文件的byte信息,第二步通过Messa ...

  2. JAVA中简单的MD5算法——MD5Utils

    文章目录 MD5信息摘要算法 Java中简单的MD5加密类MD5Utils 今日推歌 MD5信息摘要算法 MD5(Message Digest) 它是一种哈希算法,不是一种加密算法,任何长度的任意内容 ...

  3. java des 加密工具的使用,Java中DES加密解密工具类的实现实例

    这篇文章主要介绍了Java实现的DES加密解密工具类,结合具体实例形式分析了Java实现的DES加密解密工具类定义与使用方法,需要的朋友可以参考下 本文实例讲述了Java实现的DES加密解密工具类.分 ...

  4. java中使用openssl生成的rsa公私钥进行数据加解密_使用openssl生成RSA公钥和私钥对...

    在ubuntu上要使用openssl的话需要先进行安装,命令如下: sudo apt-get install openssl 安装完成就可以使用openssl了. 首先需要进入openssl的交互界面 ...

  5. Java中使用OpenSSL生成的RSA公私钥进行数据加解密

    本文出处:http://blog.csdn.net/chaijunkun/article/details/7275632,转载请注明.由于本人不定期会整理相关博文,会对相应内容作出完善.因此强烈建议在 ...

  6. Java 中的加密算法: AES

    加密算法 加密算法通常分为对称加密算法和非对称加密算法: 对称加密算法(symmetric-key cryptography):加密和解密时使用相同的密钥.常用的对称加密算法有 DES.AES. 非对 ...

  7. javascript 解密_Javascript中的AES加密和Java中的解密

    javascript 解密 AES代表高级加密系统,它是一种对称加密算法,很多时候我们需要在客户端加密一些纯文本,例如密码,然后将其发送到服务器,然后由服务器解密以进行进一步处理.AES加密和解密更加 ...

  8. Java 中常用的进制转换

    前言 所谓进制转换,就是人们利用符号来计数的方法.进制转换由一组数码符号和两个基本因素"基数"和"位权"所构成.其中基数是指进位计数制中所采用的数码的个数,逢  ...

  9. 【Android 安全】DEX 加密 ( 代理 Application 开发 | 项目中配置 OpenSSL 开源库 | 使用 OpenSSL 开源库解密 dex 文件 )

    文章目录 一.项目中配置 OpenSSL 开源库 二.OpenSSL 开源库解密参考代码 三.解密 dex 文件的 Java 代码 四.解密 dex 文件的 Jni 代码 参考博客 : [Androi ...

  10. java中stamp是什么意思_在java中怎么用cmd发送邮件?stamp怎么发送?

    发送邮件在我们的日常工作当中还是比较常用的.那么,在java中以cmd和stamp的方式应该怎么发送邮件呢? 首先说一下需要掌握的一些基本知识:1.打开talent客户端;2.掌握在cmd/stamp ...

最新文章

  1. 16-acrobat por 简单使用指南
  2. varchar和Nvarchar区别 ----转载
  3. 人工智能时代的数据中心该怎么建?腾讯给出了自己的答案
  4. 中国油气装备行业发展状况与投资前景咨询报告2022-2028年版
  5. 关于Mysql java.sql.SQLException: Access denied for user 'root'@'localhost' (using password: YES)的问题...
  6. React开发(223):详情页根据数组map处理返回值
  7. Codeforces Round #735 (Div. 2)(A-D)没有B
  8. BotVS开发基础—2.1 账户、行情、K线、深度
  9. 企业实战(Jenkins+GitLab+SonarQube)_09_jenkins发布项目到测试环境
  10. 黄聪:演示 Rect、Bounds 生成 TRect 的区别
  11. 容器技术Docker K8s 44 Serverless Kubernetes(ASK)详解-ASK弹性伸缩管理
  12. 机器翻译 | 反向翻译 (back-translation) 笔记
  13. 尚硅谷谷粒商城第十二天 商品详情页及异步编排
  14. 计算机毕业设计springboot+vue基本微信小程序的云宠物小程序-宠物领养
  15. fastjson 转下划线_Java开发里遇到的奇奇怪怪的需求---JSON键值驼峰转下划线的实现...
  16. Devops 开发运维基础篇之使用Maven构建项目
  17. 小程序,JS 计算本月、五十天前、100天前的日期。
  18. 面向对象编程、面向服务架构、基于组件开发三种编程模式的区别和适用领域
  19. 分类整理目前国内比较著名的B2C网站[转]
  20. PL/SQL 九九乘法表

热门文章

  1. DNS内网欺骗(仅供参考)
  2. turtlepen画出小黄人
  3. 2020校招前端面经
  4. 清华大学06届 计算机王煜,2006年科研成果一览表
  5. Java 排序 - 冒泡排序
  6. ADuC7026简单开发过程
  7. [4G5G基础学习]:流程 - 4G LTE 接入网的随机接入流程
  8. 大数据处理的关键技术是什么?
  9. java表格怎样设置内间距_如何设置表格的间距和背景等属性
  10. 典型相关分析及R应用