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下安装mysql时报错:FATAL ERROR: please install the following Perl modules before executing ./scripts/mysql_install_db:Data::Dumper
如题,安装mysql过程中,执行scripts/mysql_install_db --user=mysql命令时报错: FATAL ERROR: please install the followin ...
- 经典游戏--24点--c++代码实现和总体思路(简单暴力向)
24点 24点是一个非常经典的游戏,从扑克牌里抽4张牌,其中J=11,Q=12,K=13,然后经过+,-,*,/,(),的计算后,使得计算得值为24,例如抽到1,2,2,5四张牌,那么 (1+5)*( ...
- [状压DP]P1441 题解 砝码称重
前置知识:状压DP 洛谷传送门 emm....看到题目,我第一个想到的就是枚举.暴力大法好! 具体怎么枚举?当然是子集枚举啦!枚举出每一个可能的砝码选择方案.对于每一个合法的(也就是选取数量等于\(n ...
- 用 Java 拿下 HTML 分分钟写个小爬虫
本文适合有 Java 基础知识的人群 本文作者:HelloGitHub-秦人 HelloGitHub 推出的<讲解开源项目>系列,今天给大家带来一款开源 Java 版一款网页元素解析框架- ...
- Spine学习一 -渲染组件
一共有四个播放的组件: SkeletonAnimation:有点儿类似于 unity的 Animation,挂上一个spine资源,就可以跑了 SkeletonRenderer:SkeletonAni ...
- Oracle错误 ora-12514 解决方法-九五小庞
成功连到数据库上之后,查看listener状态:lsnrctl status status READY 状态,需要由非归档转为归档模式,故操作如下: 1.关闭数据库shutdown immediate ...
- Java进阶专题(十三) 从电商系统角度研究多线程(上)
前言 本章节主要分享下,多线程并发在电商系统下的应用.主要从以下几个方面深入:线程相关的基础理论和工具.多线程程序下的性能调优和电商场景下多线程的使用. 多线程J·U·C 线程池 概念 回顾线程创 ...
- 1. Error running ...: No jdk for module ... 2.
一.错误 Error running ...: No jdk for module ... Error running ...: No jdk for module ... 二.解决方法 找到File ...
- 11_IO多路复用
1.IO概述 input 和 output: 是在内存中存在的数据交换操作 内存和磁盘交换: 文件读写, 打印 内存和网络交换: recv send recvfrom, sendto IO密集型程序: ...
- Mybatis源码学习第六天(核心流程分析)之Executor分析(补充)
补充上一章没有讲解的三个Executor执行器; 还是贴一下之前的代码吧;我发现其实有些分析注释还是写在代码里面比较好,方便大家理解,之前是我的疏忽,不好意思 @Override public < ...