一、对称加密

定义:加密和解密使用相同密钥的算法。

常见的有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加密

具体的使用方法请参照网络,这个加密方式暂时还没玩透...

参考资料:

Java Web学习(三)数据加密方式详解的更多相关文章

  1. 多表连接的三种方式详解 hash join、merge join、 nested loop

    在多表联合查询的时候,如果我们查看它的执行计划,就会发现里面有多表之间的连接方式.多表之间的连接有三种方式:Nested Loops,Hash Join 和 Sort Merge Join.具体适用哪 ...

  2. Java Web -【分页功能】详解

    分页简介 分页功能在网页中是非常常见的一个功能,其作用也就是将数据分割成多个页面来进行显示. 使用场景: 当取到的数据量达到一定的时候,就需要使用分页来进行数据分割. 当我们不使用分页功能的时候,会面 ...

  3. Spring依赖注入三种方式详解

    在讲解Spring依赖注入之前的准备工作: 下载包含Spring的工具jar包的压缩包 解压缩下载下来的Spring压缩包文件 解压缩之后我们会看到libs文件夹下有许多jar包,而我们只需要其中的c ...

  4. React中使用 react-router-dom 路由传参的三种方式详解【含V5.x、V6.x】!!!

    路由传值的三种方式(v5.x) params参数 //路由链接(携带参数): <Link to='/demo/test/tom/18'}>详情</Link> //或 <L ...

  5. java web 学习三(Tomcat 服务器学习和使用2)

    一.打包JavaWeb应用 在Java中,使用"jar"命令来对将JavaWeb应用打包成一个War包,jar命令的用法如下:

  6. webServices学习三(概念详解)

    WebService通过HTTP协议完成远程调用: (深入分析) WebService只采用HTTP POST方式传输数据,不使用GET方式; -- 握手,WSDL-get, 普通http post的 ...

  7. 【基于初学者的SSH】struts02 数据封装的三种方式详解

    struts的数据封装共有3中方式,属性封装,模型驱动封装和表达式封装,其中表达式封装为常用 一:属性封装: 属性封装其实就是自己定义变量,注意变量名要和表单的name属性名一致,然后生成get和se ...

  8. springmvc 异常统一处理的三种方式详解

    1 描述  在J2EE项目的开发中,不管是对底层的数据库操作过程,还是业务层的处理过程,还是控制层的处理过程,都不可避免会遇到各种可预知的.不可预知的异常需要处理.每个过程都单独处理异常,系统的代码耦 ...

  9. Java提高学习之Object类详解(1)

    转自:http://www.importnew.com/10304.html 问:什么是Object类? 答:Object类存储在java.lang包中,是所有java类(Object类除外)的终极父 ...

随机推荐

  1. MongoDB最新4.2.7版本三分片集群修改IP实操演练

    背景 重新组网,需要对现有MongoDB分片集群服务器的IP进行更改,因此也需要对MongoDB分片集群的IP也进行相应的更新,而MongoDB分片集群的IP修改不能单纯的通过配置来进行,需要一番折腾 ...

  2. springMVC入门(四)------参数绑定与返回值类型

    简介 从之前的介绍,已经可以使用springMVC完成完整的请求.返回数据的功能. 待解决的问题:如何将数据传入springMVC的控制器进行后续的处理,完成在原生servlet/jsp开发中Http ...

  3. 第二篇 Scrum冲刺博客

    一.会议图片 二.项目进展 成员 完成情况 今日任务 冯荣新 搜索框,首页轮播图,分类导航 商品列表,商品详情轮播图 陈泽佳 背景展示,选择并显示图片 历史足迹,静态页面 徐伟浩 登录权限获取 商品信 ...

  4. Deep and Beautiful. The Reward Prediction Error Hypothesis of Dopamine

    郑重声明:原文参见标题,如有侵权,请联系作者,将会撤销发布! Contents: Abstract 1. Introduction 2. Reward-Prediction Error Meets D ...

  5. DVWA之文件上传(二)

    <?php if( isset( $_POST[ 'Upload' ] ) ) { // Where are we going to be writing to? $target_path = ...

  6. JavaSE基础--part1

    Java特性和优势 简单.面向对象.可移植性.高性能.分布式.动态性.多线程.安全性.健壮性 Java的三大版本 JavaSE 标准版(应用于桌面程序,控制台开发) JavaME 嵌入式开发(手机,小 ...

  7. 码云git clone报错Incorrect username or password ( access token )

    使用码云将仓库clone到本地,报错信息如下: D:\>git clone https://gitee.com/ycyzharry/helloworld.git Cloning into 'he ...

  8. Angular 之我见

    很久没有写过技术软文了,虽然 Angular 发布已有四年,得到了越来越多人的关注,但是仍然有很多人不分青红皂白的进行诋毁.我打算结合自己的经历从客观的角度说聊一聊我眼中的 Angular. 本人刚做 ...

  9. tars 部署

    1. mysql url:  192.168.101.3 port: 3306 pw: 123456 一键部署 sudo ./linux-install.sh localhost 123456 en0 ...

  10. Flutter Toast消息提示框插件

    Flutter Toast消息提示框插件 在开发flutter项目中,想必大家肯定会用到toast消息提示,说到这里, 大家肯定会想到https://pub.dev/ 插件库, 但是插件市场上有太多类 ...