Java Web学习(三)数据加密方式详解
一、对称加密
定义:加密和解密使用相同密钥的算法。
常见的有DES、3DES、AES、PBE等加密算法,这几种算法安全性依次是逐渐增强的。
DES加密
特点:简便、密钥长度比较短。
import javax.crypto.Cipher;
import javax.crypto.SecretKey;
import javax.crypto.SecretKeyFactory;
import javax.crypto.spec.DESKeySpec;
import java.security.SecureRandom; /**
* DES加密介绍
* DES是一种对称加密算法,所谓对称加密算法即:加密和解密使用相同密钥的算法。DES加密算法出自IBM的研究,
* 后来被美国政府正式采用,之后开始广泛流传,但是近些年使用越来越少,因为DES使用56位密钥,以现代计算能力,
* 24小时内即可被破解。虽然如此,在某些简单应用中,我们还是可以使用DES加密算法,本文简单讲解DES的JAVA实现
* 。
* 注意:DES加密和解密过程中,密钥长度都必须是8的倍数
*/
public class DESUtil { /**
* 加密
*
* @param datasource byte[] 需要加密的数据.getBytes()
* @param password String 密码(作用:生成密钥,长度要是8的倍数)
* @return byte[]
*/
public static byte[] encrypt(byte[] datasource, String password) {
try {
//1、实例化一个DES密匙工厂
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
//2、使用密码,创建一个DESKeySpec对象
DESKeySpec desKey = new DESKeySpec(password.getBytes());
//3、DES密匙工厂生成DES密钥
SecretKey securekey = keyFactory.generateSecret(desKey);
//4、实例化一个DES类型的Cipher对象,Cipher对象实际完成加密操作
Cipher cipher = Cipher.getInstance("DES");
//5、用密匙初始化Cipher对象
SecureRandom random = new SecureRandom();//DES算法要求有一个可信任的随机数源
cipher.init(Cipher.ENCRYPT_MODE, securekey, random);
//6、正式执行加密操作
return cipher.doFinal(datasource);
} catch (Throwable e) {
e.printStackTrace();
}
return null;
} /**
* 解密
*
* @param src byte[] 密钥加密过后的信息
* @param password String
* @return byte[]
* @throws Exception
*/
public static byte[] decrypt(byte[] src, String password) throws Exception {
//1、实例化一个DES密匙工厂
SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
//2、使用密码,创建一个DESKeySpec对象
DESKeySpec desKey = new DESKeySpec(password.getBytes());
//3、DES密匙工厂生成DES密钥
SecretKey securekey = keyFactory.generateSecret(desKey);
//4、实例化一个DES类型的Cipher对象,Cipher对象实际完成解密操作
Cipher cipher = Cipher.getInstance("DES");
//5、用密匙初始化Cipher对象
SecureRandom random = new SecureRandom();//DES算法要求有一个可信任的随机数源
cipher.init(Cipher.DECRYPT_MODE, securekey, random);
//6、真正开始解密操作
return cipher.doFinal(src);
} //测试
public static void main(String args[]) {
//待加密内容
String str = "测试内容";
//密码,长度要是8的倍数
String password = "9588028820109132570743325311898426347857298773549468758875018579537757772163084478873699447306034466200616411960574122434059469100235892702736860872901247123456"; byte[] result = encrypt(str.getBytes(), password);
System.out.println("加密后:" + new String(result));
//直接将如上内容解密
try {
byte[] decryResult = decrypt(result, password);
System.out.println("解密后:" + new String(decryResult));
} catch (Exception e1) {
e1.printStackTrace();
}
} }
AES加密
特点:简便、相比DES更安全。
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;
import javax.crypto.spec.SecretKeySpec;
import java.security.SecureRandom;
import java.util.Base64; /**
* AES 加密方法,是对称的密码算法(加密与解密的密钥一致),这里使用最大的 256 位的密钥
* PS:加密比DES安全,但同时速度也会相对慢一些
*/
public class AESUtil {
/**
* 获得一个长度为128位的AES密钥(256的需要换jar包,具体原因请参考网络)
*
* @return 返回经 BASE64 处理之后的密钥字符串
*/
public static String getStrKeyAES() throws Exception {
//密钥生成器,指定生成AES类型的密钥
KeyGenerator keyGen = KeyGenerator.getInstance("AES");
//加密的强随机数
SecureRandom secureRandom = new SecureRandom(String.valueOf(System.currentTimeMillis()).getBytes("utf-8"));
//初始化密钥生成器的长度为128位
keyGen.init(128, secureRandom); // 这里可以是 128、192、256、越大越安全
//生成密钥
SecretKey secretKey = keyGen.generateKey();
//Base64.getEncoder():使用base64编码来编码字节数据(多加一步更安全)
return Base64.getEncoder().encodeToString(secretKey.getEncoded());
} /**
* 将使用 Base64 加密后的字符串类型的 SecretKey 解码为 SecretKey
*
* @param strKey
* @return SecretKey
*/
public static SecretKey strKey2SecretKey(String strKey) {
byte[] bytes = Base64.getDecoder().decode(strKey);
SecretKeySpec secretKey = new SecretKeySpec(bytes, "AES");
return secretKey;
} /**
* 加密
*
* @param content 待加密内容
* @param secretKey 加密使用的 AES 密钥
* @return 加密后的密文 byte[]
*/
public static byte[] encryptAES(byte[] content, SecretKey secretKey) throws Exception {
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.ENCRYPT_MODE, secretKey);
return cipher.doFinal(content);
} /**
* 解密
*
* @param content 待解密内容
* @param secretKey 解密使用的 AES 密钥
* @return 解密后的明文 byte[]
*/
public static byte[] decryptAES(byte[] content, SecretKey secretKey) throws Exception {
Cipher cipher = Cipher.getInstance("AES");
cipher.init(Cipher.DECRYPT_MODE, secretKey);
return cipher.doFinal(content);
} //测试
public static void main(String args[]) throws Exception {
//待加密内容
String str = "测试内容";
//获得一个经 BASE64 处理之后的密钥字符串
String secretKeyStr = getStrKeyAES();
//用BASE64方式处理密钥字符串,获取密钥
SecretKey secretKey = strKey2SecretKey(secretKeyStr);
//获得加密后的内容
byte[] result = encryptAES(str.getBytes(), secretKey);
System.out.println("加密后:" + new String(result));
//将如上内容解密
try {
byte[] decryResult = decryptAES(result, secretKey);
System.out.println("解密后:" + new String(decryResult));
} catch (Exception e1) {
e1.printStackTrace();
}
}
}
二、非对称加密
定义:非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey)。一般公钥是公开的,私钥是自己保存。
常见的有RSA算法
RSA加密
具体的使用方法请参照网络,这个加密方式暂时还没玩透...
参考资料:
- chengbinbbs(特此感谢!)
- FKNIGHT0X(特此感谢!)
- Central-Perk(特此感谢!)
Java Web学习(三)数据加密方式详解的更多相关文章
- 多表连接的三种方式详解 hash join、merge join、 nested loop
在多表联合查询的时候,如果我们查看它的执行计划,就会发现里面有多表之间的连接方式.多表之间的连接有三种方式:Nested Loops,Hash Join 和 Sort Merge Join.具体适用哪 ...
- Java Web -【分页功能】详解
分页简介 分页功能在网页中是非常常见的一个功能,其作用也就是将数据分割成多个页面来进行显示. 使用场景: 当取到的数据量达到一定的时候,就需要使用分页来进行数据分割. 当我们不使用分页功能的时候,会面 ...
- Spring依赖注入三种方式详解
在讲解Spring依赖注入之前的准备工作: 下载包含Spring的工具jar包的压缩包 解压缩下载下来的Spring压缩包文件 解压缩之后我们会看到libs文件夹下有许多jar包,而我们只需要其中的c ...
- React中使用 react-router-dom 路由传参的三种方式详解【含V5.x、V6.x】!!!
路由传值的三种方式(v5.x) params参数 //路由链接(携带参数): <Link to='/demo/test/tom/18'}>详情</Link> //或 <L ...
- java web 学习三(Tomcat 服务器学习和使用2)
一.打包JavaWeb应用 在Java中,使用"jar"命令来对将JavaWeb应用打包成一个War包,jar命令的用法如下:
- webServices学习三(概念详解)
WebService通过HTTP协议完成远程调用: (深入分析) WebService只采用HTTP POST方式传输数据,不使用GET方式; -- 握手,WSDL-get, 普通http post的 ...
- 【基于初学者的SSH】struts02 数据封装的三种方式详解
struts的数据封装共有3中方式,属性封装,模型驱动封装和表达式封装,其中表达式封装为常用 一:属性封装: 属性封装其实就是自己定义变量,注意变量名要和表单的name属性名一致,然后生成get和se ...
- springmvc 异常统一处理的三种方式详解
1 描述 在J2EE项目的开发中,不管是对底层的数据库操作过程,还是业务层的处理过程,还是控制层的处理过程,都不可避免会遇到各种可预知的.不可预知的异常需要处理.每个过程都单独处理异常,系统的代码耦 ...
- Java提高学习之Object类详解(1)
转自:http://www.importnew.com/10304.html 问:什么是Object类? 答:Object类存储在java.lang包中,是所有java类(Object类除外)的终极父 ...
随机推荐
- 多主机搭建etcd集群
下载https://github.com/etcd-io/etcd/releases/download/v3.4.10/etcd-v3.4.10-linux-amd64.tar.gz分别放到两台主机上 ...
- linux 强制重启!
原文链接:https://www.cnblogs.com/wipy/p/4261472.html 有时候,linux 由于硬盘或者其它原因, 某个进程挂住了,怎么也杀不死, 输入 reboot 命令也 ...
- 区块链入门到实战(27)之以太坊(Ethereum) – 智能合约开发
智能合约的优点 与传统合同相比,智能合约有一些显著优点: 不需要中间人 费用低 代码就是规则 区块链网络中有多个备份,不用担心丢失 避免人工错误 无需信任,就可履行协议 匿名履行协议 以太坊(Ethe ...
- 2、Entity Framework Core 3.1入门教程-创建数据库和迁移
本文章是根据 微软MVP solenovex(杨旭)老师的视频教程编写而来,再加上自己的一些理解. 视频教程地址:https://www.bilibili.com/video/BV1xa4y1v7rR ...
- 4GL之Non-SCROLLING CURSOR
在4gl中CURSOR可以说是每一个程序中都会有的,而CURSOR又分为三种SCROLLING CURSOR.Non-SCROLLING CURSOR.LOCKING CURSOR. Non-SCRO ...
- C# 根据出生年月 计算天数/计算X岁X月X天字符串
public class TimeTool { //根据出生年月计算 整数天 private static int GetAgeByBirthdate(DateTime birthdate) { Da ...
- printf size_t warning
printf("print discoverList.size()=[%u]\n", discoverList.size()); src/ResultToDB.cpp:2768: ...
- 使用script打开页面
<script src="x" onerror=javascript:window.open("http://192.168.38.1/csrf.html" ...
- idea vue文件设置tab为四个空格
1.找到vue项目中有个叫.editorconfig的文件,打开可以发现有以下配置项: 2.ctrl+alt+i看看效果(单文件) 3.IDEA中对整个项目进行代码格式化 在项目的左侧树结构中,右 ...
- 面试【JAVA基础】类加载机制
1.类加载过程 1.1.加载 查找和导入class文件. 1.2.链接 验证 检验载入的class文件的正确性,完整性. 准备 给类的静态变量分配存储空间,会赋对象类型的默认值. 解析 将class常 ...