一、对称加密

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

常见的有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. 跟我一起学.NetCore之选项(Options)核心类型简介

    前言 .NetCore中提供的选项框架,我把其理解为配置组,主要是将服务中可供配置的项提取出来,封装成一个类型:从而服务可根据应用场景进行相关配置项的设置来满足需求,其中使用了依赖注入的形式,使得更加 ...

  2. Linux kernel 模块 hello 测试

    原文链接:https://www.cnblogs.com/nerohwang/p/3621316.html hello.c 文件: #include <linux/kernel.h> /* ...

  3. Java抽象类简述

    Java 抽象类 在面向对象的概念中,所有的对象都是通过类来描绘的,但是反过来,并不是所有的类都是用来描绘对象的,如果一个类中没有包含足够的信息来描绘一个具体的对象,这样的类就是抽象类. 抽象类除了不 ...

  4. docker 创建mysql和redis

    1      镜像加速 创建docker 目录 sudo mkdir -p /etc/docker 镜像加速: sudo tee /etc/docker/daemon.json <<-'E ...

  5. 光年数据分析表(seo数据监控表和爬虫数据监控表)

    http://www.wocaoseo.com/thread-307-1-1.html 光年seo培训想必很多人都知道,他们提出的数据化操作影响了很多的seo从业者,下面是他们的2个数据表,搜集于网络 ...

  6. 关于提高服务器的带宽策略bonding

    一:bonding的概念 所谓bonding就是将多块网卡绑定同一IP地址对外提供服务,可以实现网卡的带宽扩容.高可用或者负载均衡. 二:bonding的优势 1 网络负载均衡 2 提高带宽网络传输效 ...

  7. React State

    React 里只需要更新组件的state,然后根据新的 state 重新徐娜然用户界面(不要操作DOM). class Clock extends React.Component { construc ...

  8. npm install @wepy/cli -g 出错

    npm install @wepy/cli -g 出错:npm ERR! Unexpected end of JSON input while parsing near '...1.0.0" ...

  9. 【Linux利用远程SSH连接】SecureCRT中文出现乱码解决办法 Linux服务器技术

    1. 修改远程linux机器的配置   vim /etc/sysconfig/i18n   把LANG改成支持UTF-8的字符集   如:   LANG="zh_CN.UTF-8″   或者 ...

  10. C#委托链

    使用Delegate.Combine时,注意两点: 1. 不可以将不同签名的两个委托相互Combine. 2.如果将有返回值的两个委托A 和 B Combine,那么返回值是最后一个委托的的返回值,也 ...