1、加密算法

一两个月没写过博客了,上次把尚筹网的博客补了一波,然后就在找工作,这不,这个月刚入职,领导给了个代码优化的任务,使用SornarQube对项目代码进行分析,然后根据分析出来的点逐点优化。

加密算法有很多,时间长了,以前的加密算法可能会被发现漏洞,所以加密算法也要不停地更新。在项目中SornarQube就分析出了这么个问题,提示当前的加密算法(DES)太老了,不安全,应该使用AES加密。

2、AES加密

对于一个加密算法,我们首先需要了解几个概念:

  • 明文(没有加密的数据)
  • 密文(加密后的数据)
  • 密钥(约定好的用于加密和解密的钥匙)
  • 加密函数(具体加密解密的算法)

弄懂了这个之后,就可以很清楚地知道,要在Java中应用AES加密算法,需要定义两个方法,一个是加密,一个是解密。

2.1 具体加解密算法

AES算法在Java中已有具体实现,我们只需要调用即可:

private  byte[] aes(byte[] contentArray, int mode, SecretKey secretKey) throws Exception {Cipher cipher = Cipher.getInstance(ALGORITHM);cipher.init(mode, secretKey);return cipher.doFinal(contentArray);
}

其中三个参数分别为:mode表示本次操作是加密还是解密,contentArray表示加密的明文或解密的密文,secretKey表示密钥。

2.2 加密方法

/*** 加密* @param content 原文* @return 密文* @throws Exception 异常*/
public String encode(String content) throws Exception {BASE64Encoder base64Encoder = new BASE64Encoder();return base64Encoder.encode(aes(content.getBytes(charset), Cipher.ENCRYPT_MODE, secretKey));
}

2.3 解密方法

/*** 解密* @param content 密文* @return 原文* @throws Exception 异常*/
public String decode(String content) throws Exception {BASE64Decoder base64Decoder = new BASE64Decoder();byte[] result = aes(base64Decoder.decodeBuffer(content),Cipher.DECRYPT_MODE,secretKey);return new String(result,charset);
}

2.4 代码总览

将上面几个方法放在一个工具类中,代码总体如下:

public class EncryptUtil {private static final Logger log = LoggerFactory.getLogger(EncryptUtil.class);private static final String ALGORITHM = "AES";private Charset charset = null;private SecretKey secretKey = null;/*** 初始化* @param deSkey 密钥* @throws Exception*/public EncryptUtil(String deSkey, String charset) throws Exception {if (StringUtils.isNotBlank(charset)) {this.charset = Charset.forName(charset);}secretKey = generateKey();}/*** 生成密钥* @return 密钥对象* @throws NoSuchAlgorithmException*/public SecretKey generateKey() throws NoSuchAlgorithmException {KeyGenerator secretGenerator = KeyGenerator.getInstance(ALGORITHM);SecureRandom secureRandom = new SecureRandom();secretGenerator.init(secureRandom);return secretGenerator.generateKey();}/*** 加密* @param content 原文* @return 密文* @throws Exception 异常*/public String encode(String content) throws Exception {BASE64Encoder base64Encoder = new BASE64Encoder();return base64Encoder.encode(aes(content.getBytes(charset), Cipher.ENCRYPT_MODE, secretKey));}/*** 解密* @param content 密文* @return 原文* @throws Exception 异常*/public String decode(String content) throws Exception {BASE64Decoder base64Decoder = new BASE64Decoder();byte[] result = aes(base64Decoder.decodeBuffer(content),Cipher.DECRYPT_MODE,secretKey);return new String(result,charset);}private  byte[] aes(byte[] contentArray, int mode, SecretKey secretKey) throws Exception {Cipher cipher = Cipher.getInstance(ALGORITHM);cipher.init(mode, secretKey);return cipher.doFinal(contentArray);}public static void main(String[] args) {try {//String test = "pms-adapter-pwd";String test = "pms-adapter-pwd-prod";// 自定义密钥String key = "abcd9ba45bfd500642328ec03ad8ef1b6e75";EncryptUtil des = new EncryptUtil(key, "utf-8");System.out.println("加密前的字符:" + test);String encode = des.encode(test);System.out.println("加密后的字符:" + encode);String decode = des.decode(encode);System.out.println("解密后的字符:" + decode);} catch (Exception e) {log.error(e.getMessage());}}
}

在工具类初始化的时候,需要传入两个值,一个是加密方和解密方约定的密钥,一个是字符串的编码格式。

3、工具类测试

public static void main(String[] args) {try {// 明文String test = "I love you.";// 自定义密钥String key = "abcd9ba45bfd500642328ec03ad8ef1b6e75";// 密钥生成EncryptUtil des = new EncryptUtil(key, "utf-8");System.out.println("加密前的字符:" + test);// 加密String encode = des.encode(test);System.out.println("加密后的字符:" + encode);// 解密String decode = des.decode(encode);System.out.println("解密后的字符:" + decode);} catch (Exception e) {log.error(e.getMessage());}
}

4、注意事项

在写这个代码的时候,我也看了好多博客,它们有一个共同点,就是在加密和解密的中间过程,输出的是字节数组,但是因为我这个是代码优化,我必须要返回字符串,于是我就用了byte数组转String的函数,最后失败了,因为byte数组转String后再转回byte数组,数据会发生变化,而AES加密算法最重要的就是解密的时候密文的位数必须是16位的倍数,而数据发生变化后,解密就会失败,所以要用BASE64Decoder。

AES加密算法在Java中的应用相关推荐

  1. aes加密算法 java实现,AES加密算法的java实现

    AES加密算法的java实现 package com.encryp; import java.security.InvalidKeyException; import java.security.No ...

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

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

  3. Javascript中的AES加密和Java中的解密

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

  4. [转]AES加密算法及java代码实现

    转自:http://www.cnblogs.com/block2016/p/5596676.html AES加密 AES是一个对称密码,旨在取代DES成为广泛使用的标准. 一.AES的加密过程 二.A ...

  5. 关于AES算法及JAVA中的实现

    为什么80%的码农都做不了架构师?>>>    什么是AES 密码学中的高级加密标准(Advanced Encryption Standard,AES),又称Rijndael加密法, ...

  6. AES加密算法的JAVA实现

    最近公司需要,看了看AES对称加密算法,具体原理没有仔细研究还,先说说用法吧,由于能力有限,不足之处请大家多多指教,好了,不说废话了,直接上代码 /** * 加密 * * @param content ...

  7. java中各种加密算法的实践应用

    1.前言 数字签名.信息加密是前后端开发都经常需要使用到的技术,应用场景包括了用户登入.交易.信息通讯.oauth 等等,不同的应用场景也会需要使用到不同的签名加密算法,或者需要搭配不一样的签名加密算 ...

  8. AES加密算法java实现

    转载自: https://blog.csdn.net/zyhlwzy/article/details/77948165 AES加密算法是密码学中的高级加密标准,该加密算法采用对称分组密码体制,密钥长度 ...

  9. 常用加密算法及Java实现

    欢迎光临我的博客查看最新文章: https://river106.cn 1.概述 加密在平时开发中也会经常用到,涉及登录.支付.接口设计等方面,可能都需要考虑到加密算法,加密算法分对称加密和非对称加密 ...

最新文章

  1. matlab动力学方程,机器人动力学方程(二):拉格朗日法
  2. 理解熵:机器学习的黄金标准
  3. jQuery——获取当前索引值
  4. 深度理解do{} while(0)语句的作用
  5. iPhone中的heic格式怎么查看,heic文件怎么打开
  6. linux asm 磁盘管理,asm磁盘管理篇
  7. Git丢弃不要的修改
  8. 目标跟踪-粒子滤波算法
  9. ubuntu linux theme,如何在Ubuntu 20.04中启用全局暗黑主题
  10. java.sql.SQLException: ORA-01691: Lob 段 SONARQUBE2.SYS_LOB0000119128C00008$$ 无法通过 128 (在表空间 USERS 中
  11. oracle 数据管理,Oracle深入浅出之数据管理
  12. python环境变量设置失败
  13. 程序员自学成才-老程序员给新手的四条自学经验
  14. hdu 1862 EXCEL排序
  15. 天地伟业tiandy如何连手机_西游释厄传手机版下载(附出招表)-西游释厄传手机版金手指下载v2020.10.24.14...
  16. netscape.exe_评论-Netscape 6.1
  17. 71 Climbing staring C++
  18. Python爬虫实战——今日头条图片下载
  19. 修改windows的主机映射文件(hosts文件)
  20. 笑死:Welcome to Skip Thompson's Homepage

热门文章

  1. 心情不好时请看:小P孩的故事
  2. 测试案例:如何测试一把椅子?
  3. 怎么做gif图?你知道好用的制作方法吗?
  4. Ubuntu下codeblocks安装配置方法及opencv配置方法
  5. python爬虫之类的方法爬取一部小说
  6. linux中ldap添加属性,linux – ldap_add没有这样的对象(32)匹配dn dc = domain dc = com
  7. stateflow(状态流)简单应用
  8. 计算机英语教程第六版pdf,计算机英语教程.pdf
  9. OpenStack全网最全部署教程
  10. 【微信小程序】一文带你读懂云开发