使用JDK中的安全包对数据进行加解密
本文以使用DES对称加密算法为例使用jdk对数据进行加密解密。
首先需要了解Provider类,它是jdk引入的密码服务提供者概念,实现了Java安全性的一部分或者全部。Provider 可能实现的服务包括:
算法(如DES、RSA、MD5);密钥的生成、转换和管理。
通常java运行时环境至少安装了一个名字为“SUN”的预设Provider,如果查看本机支持的Provider类型可以通过以下代码:
for(Provider p : Security.getProviders()){
System.out.println(p.getName()+":"+p.getInfo());
}
我本机运行结果为:
SUN:SUN (DSA key/parameter generation; DSA signing; SHA-1, MD5 digests; SecureRandom; X.509 certificates; JKS keystore; PKIX CertPathValidator; PKIX CertPathBuilder; LDAP, Collection CertStores, JavaPolicy Policy; JavaLoginConfig Configuration)
SunRsaSign:Sun RSA signature provider
SunJSSE:Sun JSSE provider(PKCS12, SunX509 key/trust factories, SSLv3, TLSv1)
SunJCE:SunJCE Provider (implements RSA, DES, Triple DES, AES, Blowfish, ARCFOUR, RC2, PBE, Diffie-Hellman, HMAC)
SunJGSS:Sun (Kerberos v5, SPNEGO)
SunSASL:Sun SASL provider(implements client mechanisms for: DIGEST-MD5, GSSAPI, EXTERNAL, PLAIN, CRAM-MD5; server mechanisms for: DIGEST-MD5, GSSAPI, CRAM-MD5)
XMLDSig:XMLDSig (DOM XMLSignatureFactory; DOM KeyInfoFactory)
SunPCSC:Sun PC/SC provider
SunMSCAPI:Sun's Microsoft Crypto API provider
从结果中可以看到名称为“SunJCE”的Provider提供DES、Triple DES(即3DES), AES、RSA、Diffie-Hellman等算法的实现,下面使用此Provider完成对称加密。
KeyGenerator类提供(对称)密钥生成器的功能,使用getInstance 类方法构造,代码如下:
KeyGenerator kg = KeyGenerator.getInstance("DES","SunJCE");
SecretKey类是对称密钥的封装类,它不包含方法或常量,其唯一目的是分组对称密钥(并为其提供类型安全),从kg中获取
SecretKey key = kg.generateKey();
以上是产生密钥的过程,真正实现对数据加解密功能的类是Cipher,此类为加密和解密提供密码功能,它构成了 Java Cryptographic Extension (JCE) 框架的核心。
为创建 Cipher 对象,应用程序调用 Cipher 的 getInstance 方法并将所请求“转换”的名称传递给它,还可以指定Provider的名称,本文中采用“SunJCE”。
“转换”是一个字符串,它描述为产生某种输出而在给定的输入上执行的操作(或一组操作)。转换始终包括加密算法的名称(例如,DES),后面可能跟有一个反馈模式和填充方案(反馈模式和填充方案可以理解为 加密前对数据的预处理)
“转换”具有以下两种形式:“算法/模式/填充”或“算法”(这种情况,使用模式和填充方案特定于Provider的默认值)。本例中采用以下有效的转换:
Cipher c = Cipher.getInstance("DES/CBC/PKCS5Padding","SunJCE");//DES加密算法,CBC的反馈模式,PKCS5Padding的填充方案
使用CBC反馈模式需要一个初始化向量,由类IvParameterSpec来完成,它需要是一个长度为8的byte数组。
Cipher的init方法负责初始化,初始化需要指定模式和密钥,密钥本文采用上面已经生成的key,模式有四种ENCRYPT_MODE、DECRYPT_MODE、WRAP_MODE、UNWRAP_MODE分别表示加密、解密、密钥包装或密钥解包。
如果加密则采用方法init(Cipher.ENCRYPT_MODE, key);
如果解密则采用方法init(Cipher.DECRYPT_MODE, key);
WRAP_MODE、UNWRAP_MODE模式是用来实现数字信封用的,本文不作介绍。
通常对数据进行加解密,使用方法doFinal(byte[] input),传入参数是byte数组。
为了在http协议下快速传输数据,且某些系统中只能使用ASCII字符,通常采用Base64编码。Base64就是用来将非ASCII字符的数据转换成ASCII字符的一种方法。还可以提高可视性。
通过以上分析可以得到以下代码:
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.security.InvalidAlgorithmParameterException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.NoSuchProviderException;
import javax.crypto.BadPaddingException;
import javax.crypto.Cipher;
import javax.crypto.IllegalBlockSizeException;
import javax.crypto.KeyGenerator;
import javax.crypto.NoSuchPaddingException;
import javax.crypto.SecretKey;
import javax.crypto.spec.IvParameterSpec;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder; public class SecurityTest { //密钥生成器
private KeyGenerator kg; //对称密钥
private SecretKey key; //加解密时的初始化向量must be 8 bytes long
private IvParameterSpec iv; //Cipher,加解密主体实例
private Cipher c; //该构造方法初始化DES密钥和Cipher
public SecurityTest() throws NoSuchAlgorithmException, NoSuchProviderException, NoSuchPaddingException, UnsupportedEncodingException{
kg = KeyGenerator.getInstance("DES","SunJCE");
key = kg.generateKey();
iv = new IvParameterSpec("12345678".getBytes("UTF-8"));
c = Cipher.getInstance("DES/CBC/PKCS5Padding","SunJCE");//DES加密算法,CBC的反馈模式,PKCS5Padding的填充方案 ,SunJCE:Provider
} /**
* DES加密
*/
public String encrypt(String src) throws InvalidKeyException, IllegalBlockSizeException, BadPaddingException, InvalidAlgorithmParameterException{
//初始化-- ENCRYPT_MODE:加密模式, key:密钥,iv:初始化向量
c.init(Cipher.ENCRYPT_MODE, key, iv);
byte[] srcByte = src.getBytes();
//加密
byte[] targetByte = c.doFinal(srcByte);
//Base64编码
String targetString = new BASE64Encoder().encode(targetByte);
return targetString;
} /**
* DES解密
*/
public String decrypt(String srcString) throws InvalidKeyException, IllegalBlockSizeException, BadPaddingException, IOException, InvalidAlgorithmParameterException {
//初始化-- DECRYPT_MODE:解密模式, key:密钥,iv:初始化向量
c.init(Cipher.DECRYPT_MODE, key, iv);
//Base64解码
byte[] srcByte = new BASE64Decoder().decodeBuffer(srcString);
//解密
byte[] targetByte = c.doFinal(srcByte);
return new String(targetByte);
} public static void main(String[] args) throws Exception {
SecurityTest test = new SecurityTest();
String src = "使用JKD进行加解密--DES算法测试!__小印";
System.out.println("原文:" + src);
String secret = test.encrypt(src);
System.out.println("密文:" + secret);
String target = test.decrypt(secret);
System.out.println("解密得到原文:" + target);
}
我本机运行结果为:
原文:使用JKD进行加解密--DES算法测试!__小印
密文:P8Xi4Jfvq9Eus0c1OTE32wK60rjHwPxZ8tRiElxOd5m69+vI37IGtw==
解密得到原文:使用JKD进行加解密--DES算法测试!__小印
注意:本文采用的是随机密钥,所以每次运行得到的密文是不一样的,jdk也提供自定义的密钥 ^_^
使用JDK中的安全包对数据进行加解密的更多相关文章
- SpringBoot中如何灵活的实现接口数据的加解密功能?
数据是企业的第四张名片,企业级开发中少不了数据的加密传输,所以本文介绍下SpringBoot中接口数据加密.解密的方式. 本文目录 一.加密方案介绍二.实现原理三.实战四.测试五.踩到的坑 一.加密方 ...
- .net core中使用openssl的公钥私钥进行加解密
这篇博文分享的是 C#中使用OpenSSL的公钥加密/私钥解密 一文中的解决方法在 .net core 中的改进.之前的博文针对的是 .NET Framework ,加解密用的是 RSACryptoS ...
- 曹工力荐:调试 jdk 中 rt.jar 包部分的源码(可自由增加注释,修改代码并debug)
背景 大家知道,jdk安装的目录下,一般会有个src.zip包,这个包基本对应了rt.jar这个包.rt.jar这个包里面,就放了jdk中,jdk采用java实现的那部分类库代码,比如java.lan ...
- Mybatis使用TypeHandler实现数据的加解密转换
参考: MyBatis之TypeHandler: https://www.cnblogs.com/yulinfeng/p/5991170.html 前段时间收到这么个需求:为安全起见,要求在数据库 ...
- java 根据秘钥,对数据进行加解密
package test; import com.alibaba.fastjson.JSONObject; import sun.misc.BASE64Decoder; import sun.misc ...
- JDK中的Atomic包中的类及使用
引言 Java从JDK1.5开始提供了java.util.concurrent.atomic包,方便程序员在多线程环境下,无锁的进行原子操作.原子变量的底层使用了处理器提供的原子指令,但是不同的CPU ...
- JDK中主要的包介绍
- vue中给请求到的数据对象加属性问题
今天发现了个很奇怪的问题,我在做一个:点击列表 使点中的列表项变色的功能,而且是多个大列表项,在每个大列表项里点击切换列表项的时候不影响其他大列表项的选项. 解决思路,因为这些大列表项是请求到的数据 ...
- 围在栅栏中的爱WriteUp(附QWE密码加解密脚本)
题目的链接:http://www.shiyanbar.com/ctf/1917 1.首先题目给出的是摩尔斯电码: 在下面的网站上解密:https://www.cryptool.org/en/cto-c ...
随机推荐
- ichartjs 使用BUG,assign_scale:true 解决
今天纯属灌水,好久没灌水的. 最近使用了flotr2 和 ichartjs进行canvas图标的开发,都不能满足需求. 没办法,先将就用用吧.然后,既然其他大神推荐使用ichartjs,为了统一,我也 ...
- SQL点滴32—Excel中CONCATENATE函数生成SQL语句
原文:SQL点滴32-Excel中CONCATENATE函数生成SQL语句 当拿到一个Excel的时候需要将这里面的数据插入到数据库里面,该怎么办,除了使用SSIS数据导入之外还可以使用Excel中的 ...
- PHP 18:data_valid_fns.php 看正则表达式
原文:PHP 18:data_valid_fns.php 看正则表达式 本章介绍正则表达式.先看看data_valid_fns.php的代码吧. 简要介绍一下.fill ...
- C#JSON序列化与反序列化
原文:C#JSON序列化与反序列化 windows phone学习也有一段时间了,想要做一个新闻客户端练练手,于是就在网上找看有没有接口之类.在天狗播客找到了热点热词新闻资讯API开放接口,接口提供的 ...
- HBuilder CSS 自定义代码块
=begin 本文档是CSS代码块的编辑文件.注意不要把其他语言的设置放到css里来. HBuilder可使用ruby脚本来编辑代码块和增强操作命令. 1.编辑代码块 如果要新增一个代码块,复制如下一 ...
- leetcode 第43题 Wildcard Matching
题目:(这题好难.题目意思类似于第十题,只是这里的*就是可以匹配任意长度串,也就是第十题的‘.*’)'?' Matches any single character. '*' Matches any ...
- object 插入元素,插入HTML页面
object标签用于定义一个嵌入的对象,包括:图像.音频.Java applets.ActiveX.PDF以及Flash.该标签允许您规定插入HTML文档中的对象的数据和参数,以及可用来显示和操作数据 ...
- js实现tooltip动态提示效果(文字版)
页面中经常用到鼠标移动到一个元素上面显示提示的功能,最开始的做法是在下面创建一个div然后动态显示这个div,但是这样需要加很多div,比较麻烦. 针对上面个的需求,这边写了一个tooltip动态提示 ...
- 【c++类的构造函数具体解释
】
一.构造函数是干什么的 class Dog { public: // 类Dog的构造函数 // 特点:以类名作为函数名,无返回类型 Dog() ...
- sugarcrm关于邮件设置几个不好理解的地方
陈沙克日志 把我的过程记录下来,以免以后忘了 2008-06-11 12:32 sugarcrm关于邮件设置几个不好理解的地方 最近看sugarcrm的使用,别的基本使用,没有什么问题,几天就 ...