java之--加密、解密算法
0、概述
在项目开发中,我们常需要用到加解密算法,加解密算法主要分为三大类:
1、对称加密算法,如:AES、DES、3DES
2、非对称加密算法,如:RSA、DSA、ECC
3、散列算法,如:MD5、SHA1、HMAC
1、各算法对比
不废话,直接开表格对比:
对称加密算法(加解密密钥相同)
名称 |
密钥长度 |
运算速度 |
安全性 |
资源消耗 |
DES |
56位 |
较快 |
低 |
中 |
3DES |
112位或168位 |
慢 |
中 |
高 |
AES |
128、192、256位 |
快 |
高 |
低 |
非对称算法(加密密钥和解密密钥不同)
名称 |
成熟度 |
安全性(取决于密钥长度) |
运算速度 |
资源消耗 |
RSA |
高 |
高 |
慢 |
高 |
DSA |
高 |
高 |
慢 |
只能用于数字签名 |
ECC |
低 |
高 |
快 |
低(计算量小,存储空间占用小,带宽要求低) |
散列算法比较
名称 |
安全性 |
速度 |
SHA-1 |
高 |
慢 |
MD5 |
中 |
快 |
对称与非对称算法比较
名称 |
密钥管理 |
安全性 |
速度 |
对称算法 |
比较难,不适合互联网,一般用于内部系统 |
中 |
快好几个数量级(软件加解密速度至少快100倍,每秒可以加解密数M比特数据),适合大数据量的加解密处理 |
非对称算法 |
密钥容易管理 |
高 |
慢,适合小数据量加解密或数据签名 |
3、项目中常用总结
对称加密: AES(128位),
非对称加密: ECC(160位)或RSA(1024),
消息摘要: MD5
数字签名:DSA
其中,AES和MD5最为常用,
4、代码示例
下面直接实现一个包含AES和MD5的加解密类,不废话,直接上步骤:
1、添加第三方包的依赖:项目用到两个第三方包,在pom中添加这两个包的依赖:
<!-- 添加加解密算法的依赖 -->
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.4</version>
</dependency>
<dependency>
<groupId>org.apache.directory.studio</groupId>
<artifactId>org.apache.commons.codec</artifactId>
<version>1.8</version>
</dependency>
2、import相关包;
3、AES有五种模式(ECB、CBC、CFB、OFB、CTR),我们采用的是CBC,各工作模式的远离自行百度,好了,直接上代码:
package com.anson.utility; //引入相关包
import javax.crypto.Cipher;
import javax.crypto.spec.IvParameterSpec;
import javax.crypto.spec.SecretKeySpec; //引入第三方包
import org.apache.commons.codec.binary.Base64;
import org.apache.commons.codec.digest.DigestUtils; public class Encrypt { //--------------AES---------------
private static final String KEY = "f4k9f5w7f8g4er26"; // 密匙,必须16位
private static final String OFFSET = "5e8y6w45ju8w9jq8"; // 偏移量
private static final String ENCODING = "UTF-8"; // 编码
private static final String ALGORITHM = "AES"; //算法
private static final String CIPHER_ALGORITHM = "AES/CBC/PKCS5Padding"; // 默认的加密算法,CBC模式 //---------------MD5-------------------
private static final String MD5KEY = "f4k9f5w7f8g4er26"; // 密匙 /**
* AES加密
* @param data
* @return String
* @author anson
* @date 2019-8-24 18:43:07
*/
public static String AESencrypt(String data) throws Exception
{
Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
SecretKeySpec skeySpec = new SecretKeySpec(KEY.getBytes("ASCII"), ALGORITHM);
IvParameterSpec iv = new IvParameterSpec(OFFSET.getBytes());//CBC模式偏移量IV
cipher.init(Cipher.ENCRYPT_MODE, skeySpec, iv);
byte[] encrypted = cipher.doFinal(data.getBytes(ENCODING));
return new Base64().encodeToString(encrypted);//加密后再使用BASE64做转码
} /**
* AES解密
* @param data
* @return String
* @author anson
* @date 2019-8-24 18:46:07
*/
public static String AESdecrypt(String data) throws Exception
{
Cipher cipher = Cipher.getInstance(CIPHER_ALGORITHM);
SecretKeySpec skeySpec = new SecretKeySpec(KEY.getBytes("ASCII"), ALGORITHM);
IvParameterSpec iv = new IvParameterSpec(OFFSET.getBytes()); //CBC模式偏移量IV
cipher.init(Cipher.DECRYPT_MODE, skeySpec, iv);
byte[] buffer = new Base64().decode(data);//先用base64解码
byte[] encrypted = cipher.doFinal(buffer);
return new String(encrypted, ENCODING);
} //---------------------MD5--------------------
/**
* MD5方法
* @param text 明文
* @return 密文
* @author anson
* @date 2019-8-24 18:54:42
*/
public static String MD5encrypt(String text) throws Exception {
//加密后的字符串
String encodeStr=DigestUtils.md5Hex(text + MD5KEY);
return encodeStr;
} /**
* MD5验证方法
* @param text 明文
* @param md5 密文
* @return true/false
* @author anson
* @date 2019-8-24 18:58:56
*/
public static boolean verify(String text, String md5) throws Exception
{
//根据传入的密钥进行验证
String md5Text = MD5encrypt(text);
if(md5Text.equalsIgnoreCase(md5))
{
return true;
}
return false;
} }
java之--加密、解密算法的更多相关文章
- JAVA常用加密解密算法Encryption and decryption
加密,是以某种特殊的算法改变原有的信息数据,使得未授权的用户即使获得了已加密的信息,但因不知解密的方法,仍然无法了解信息的内容.大体上分为双向加密和单向加密,而双向加密又分为对称加密和非对称加密(有些 ...
- java 实现 DES加密 解密算法
DES算法的入口参数有三个:Key.Data.Mode.其中Key为8个字节共64位,是DES算法的工作密钥:Data也为8个字节64位,是要被加密或被解密的数据:Mode为DES的工作方式,有两种: ...
- php与java通用AES加密解密算法
AES指高级加密标准(Advanced Encryption Standard),是当前最流行的一种密码算法,在web应用开发,特别是对外提供接口时经常会用到,下面是我整理的一套php与java通用的 ...
- C#与Java同步加密解密DES算法
在实际项目中,往往前端和后端使用不同的语言.比如使用C#开发客户端,使用Java开发服务器端.有时出于安全性考虑需要将字符加密传输后,由服务器解密获取.本文介绍一种采用DES算法的C#与Java同步加 ...
- java加密解密算法位运算
一.实例说明 本实例通过位运算的异或运算符 “ ^ ” 把字符串与一个指定的值进行异或运算,从而改变每个字符串中字符的值,这样就可以得到一个加密后的字符串.当把加密后的字符串作为程序输入内容,异或运算 ...
- 兼容javascript和C#的RSA加密解密算法,对web提交的数据进行加密传输
Web应用中往往涉及到敏感的数据,由于HTTP协议以明文的形式与服务器进行交互,因此可以通过截获请求的数据包进行分析来盗取有用的信息.虽然https可以对传输的数据进行加密,但是必须要申请证书(一般都 ...
- RC4加密解密算法
RC4相对是速度快.安全性高的加密算法.在实际应用中,我们可以对安全系数要求高的文本进行多重加密,这样破解就有一定困难了.如下测试给出了先用RC4加密,然后再次用BASE64编码,这样双重锁定,保证数 ...
- md5加密以及可逆的加密解密算法
md5加密 package gov.mof.fasp2.gcfr.adjustoffset.adjust; import java.security.MessageDigest; public cla ...
- 你真的了解字典(Dictionary)吗? C# Memory Cache 踩坑记录 .net 泛型 结构化CSS设计思维 WinForm POST上传与后台接收 高效实用的.NET开源项目 .net 笔试面试总结(3) .net 笔试面试总结(2) 依赖注入 C# RSA 加密 C#与Java AES 加密解密
你真的了解字典(Dictionary)吗? 从一道亲身经历的面试题说起 半年前,我参加我现在所在公司的面试,面试官给了一道题,说有一个Y形的链表,知道起始节点,找出交叉节点.为了便于描述,我把上面 ...
- DES对 json 、http参数加密解密算法
网上众多大神们的众多方式实现加解密操作及保障数据安全性.今天无意中发现一篇以 DES加密解密算法.摘抄如下 工具类: import java.security.SecureRandom; import ...
随机推荐
- 一个九位数-python
有一个9位数由1~9的9个数字组成, 每个数字只能出现一次:其第一位能被1整除, 前两位能被2整除, 前三位能被3整除...依次类推,前9位能被9整除.所有的9位数中,只有一个数字满足这些条件,请你输 ...
- JAVA程序打包方法-挺好
https://blog.csdn.net/dj0721/article/details/72462688/
- 求矩阵最少(或最多)路径和(python实现)
1.递归方式 求最短,最终状态即右下角 f(v, i, j) = min(f(v, i - 1, j), f(v, i, j - 1)) + v[i][j] 最长只需将min改为max即可 impor ...
- Pycharm创建项目时 自动添加头部信息
1.打开PyCharm,选择File--Settings 2.依次选择Editor---Code Style-- File and Code Templates---Python Script 3.. ...
- [转载]2.9 UiPath中断活动Continue的介绍和使用
一.Continue的介绍 跳过当前For Each 循环内的迭代, 结束本次循环,Continue控件只能用于For Each循环中 二.Continue在UiPath中结合For Each循环的使 ...
- unittest使用数据驱动ddt
简介 ddt(data driven test)数据驱动测试:由外部数据集合来驱动测试用例,适用于测试方法不变,但需要大量变化的数据进行测试的情况,目的就是为了数据和测试步骤的分离 由于unittes ...
- java笔试面试第一天
好久未曾启用我的博客,最近来上海找工作,想将笔试面试的过程做个记录,毕竟有总结才有提高嘛.今天算是笔试面试正式开始第一天吧,以下就是我的笔试总结(没有原题了,只有知识点): 笔试题1:java sta ...
- 本地yum配置
yum yum(Yellow dog Updater, Modified)是一个在 Fedora 和 RedHat 以及 CentOS 中的 Shell 前端软件包管理器.基于 RPM 包管理,能够从 ...
- C++中对C的扩展学习新增语法——For循环以及AUTO类型
For循环以及AUTO类型 For代码实现: AUTO类型: 1.auto自动类型推导,省事. 2.auto主要在模板中用的多,模板的类型比较长,使用auto可以简化代码. 3.不要轻易使用,我们在编 ...
- nyoj 803-A/B Problem
803-A/B Problem 内存限制:64MB 时间限制:1000ms 特判: No 通过数:2 提交数:4 难度:3 题目描述: 做了A+B Problem,A/B Problem不是什么问题了 ...