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类除外)的终极父 ...
随机推荐
- Linux kernel 模块 hello 测试
原文链接:https://www.cnblogs.com/nerohwang/p/3621316.html hello.c 文件: #include <linux/kernel.h> /* ...
- 操作系统-I/O(4)I/O控制方式
I/O控制的方式分为: 程序直接控制方式(最简单的I/O方式) • 无条件传送:对简单外设定时(同步)进行数据传送 • ...
- Federated Learning: Challenges, Methods, and Future Directions
郑重声明:原文参见标题,如有侵权,请联系作者,将会撤销发布! arXiv:1908.07873v1 [cs.LG] 21 Aug 2019 Abstract 联邦学习包括通过远程设备或孤立的数据中心( ...
- MPI自定义数据类型
自定义数据类型 1.数据类型辅助函数 MPI_Type_commit int MPI_Type_commit( MPI_Datatype *datatype ); 在通信中使用数据类型对象之前,必须提 ...
- TCP/IP的三次握手, 四次挥手
三次握手: 1. X初始序号, SYN: , 发送 将syn=1, X发送至client 2. 服务器发送 ACK(确认包)=1, SYN=1, 接受顺序号(acknowledge number ...
- seo快速排名利器之高权重二级域名
http://www.wocaoseo.com/thread-225-1-1.html 正规的白帽手法优化一个关键词一般都需要两三个月才能把词做上去,但是现在也有一批做网站优化的采取特殊 ...
- Mac搭建appium环境
1.安装brew 查看是否已经装上brew,终端输入命令:brew --version,已经装上的就不用再装了: 如果没有安装,终端输入命令:ruby -e "$(curl -fsSL ht ...
- Ubuntu 20.04.1 安装软件和系统配置脚本
#!/bin/bash # https://launchpad.net/ubuntu # https://www.easyicon.net # https://download-chromium.ap ...
- 深入了解Kafka【四】消费者的Offset管理
1.Offset Topic Consumer通过提交Offset来记录当前消费的最后位置,以便于消费者发生崩溃或者有新的消费者加入消费者组,而引发的分区再均衡操作,每个消费者可能会分到不同的分区.我 ...
- 实际项目中遇到EF实体类的操作问题及操作方法
之前一直做ASP,都是直接写数据库操作语句,但是现在使用linq或者EF了,具体数据库操作不会了,遇到几个问题,然后经过查找资料解决了,记录一下. 一.遇到序列化问题 遇到循环引用问题,我的项目是一个 ...