java 对象加密_java.security包实现对象加密
Java原生支持常见的加密算法,例如DES、RSA。随便写点关于Java安全包的东西。
Java.security.Provider对象官方的解释是:实现了 Java 安全性的一部分或者全部。
provider 可能实现的服务包括:算法(如 DSA、RSA、MD5 或 SHA-1),密钥的生成、转换和管理设施(如用于特定于算法的密钥)。
每个 provider 有一个名称和一个版本号,并且在每个它装入运行时中进行配置。
可以通过如下语句查看本地JDK提供的provider类型:
for(Provider p : Security.getProviders()){
System.out.println(p+" "+p.getInfo());
}
javax.crypto.KeyGenerator对象作为对称密钥生成器,JavaAPI当中给出的解释是:密钥生成器是使用此类的某个 getInstance 类方法构造的。
KeyGenerator 对象可重复使用,也就是说,在生成密钥后,可以重复使用同一个 KeyGenerator 对象来生成更多的密钥。生成密钥的方式有两种:与算法无关的方式和特定于算法的方式。不多啰嗦,可以查看API文档,当中强调了一点:如果客户端没有显式地初始化 KeyGenerator(通过调用 init 方法),那么每个提供者都必须提供(并记录)默认初始化。
javax.crypto.SecretKey对称表示密钥。
javax.crypto.spec.IvParameterSpec,此类指定一个初始化向量 (IV)。使用 IV 的例子是反馈模式中的密码,如,CBC 模式中的 DES 和使用 OAEP 编码操作的 RSA 密码。
javax.crypto.Cipher此类为加密和解密提供密码功能。它构成了 Java Cryptographic Extension (JCE) 框架的核心。API中的解释是:为创建 Cipher 对象,应用程序调用 Cipher 的getInstance 方法并将所请求转换的名称传递给它。还可以指定提供者的名称(可选)。
转换 是一个字符串,它描述为产生某种输出而在给定的输入上执行的操作(或一组操作)。转换始终包括加密算法的名称(例如,DES),后面可能跟有一个反馈模式和填充方案。
转换具有以下形式:
“算法/模式/填充”或
“算法”
(后一种情况下,使用模式和填充方案特定于提供者的默认值)。例如,以下是有效的转换:
Cipher c = Cipher.getInstance("DES/CBC/PKCS5Padding");
好了,基本的对象介绍完了,下面来看看代码:
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 java.security.Provider;
import java.security.Security;
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;
public class JavaSecurity {
public static void main(String[] args) {
JavaSecurity js = new JavaSecurity();
String test = "keep foolish , keep hungry";
String entryString = js.encrypt(test);
System.out.println(entryString);
String decryptString = js.decrypt(entryString);
System.out.println(decryptString);
}
public JavaSecurity(){
try {
this.init();
} catch (NoSuchAlgorithmException | NoSuchProviderException
| UnsupportedEncodingException | NoSuchPaddingException e) {
e.printStackTrace();
}
}
/**
* init()
* @throws NoSuchAlgorithmException
* @throws NoSuchProviderException
* @throws UnsupportedEncodingException
* @throws NoSuchPaddingException
*/
public void init() throws NoSuchAlgorithmException, NoSuchProviderException, UnsupportedEncodingException, NoSuchPaddingException{
//密钥生成器
keyGenerator = KeyGenerator.getInstance("DES", "SunJCE");
//对称密钥
key = keyGenerator.generateKey();
//加解密时的初始化向量 8bytes
iv = new IvParameterSpec("87654321".getBytes("utf-8"));
//DES加密算法,CBC反馈模式,PKCSPadding的填充方案
cipher = Cipher.getInstance("DES/CBC/PKCS5Padding");
}
/**
* 加密
* @param str
* @return
* @throws InvalidKeyException
* @throws InvalidAlgorithmParameterException
* @throws IllegalBlockSizeException
* @throws BadPaddingException
*/
public String encrypt(String str) {
String returnStr = "";
try {
cipher.init(Cipher.ENCRYPT_MODE, key , iv);
} catch (InvalidKeyException | InvalidAlgorithmParameterException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
byte[] strByte = str.getBytes();
//加密
byte[] encryStr = null;
try {
encryStr = cipher.doFinal(strByte);
} catch (IllegalBlockSizeException | BadPaddingException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
returnStr = new sun.misc.BASE64Encoder().encode(encryStr);
return returnStr;
}
/**
* 解密
* @param str
* @return
* @throws InvalidKeyException
* @throws InvalidAlgorithmParameterException
* @throws IOException
* @throws IllegalBlockSizeException
* @throws BadPaddingException
*/
public String decrypt(String str) {
String returnStr = "";
try {
cipher.init(Cipher.DECRYPT_MODE, key, iv);
} catch (InvalidKeyException | InvalidAlgorithmParameterException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
byte[] strByte = null;
try {
strByte = new BASE64Decoder().decodeBuffer(str);
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
byte[] returnStrByte = null;
try {
returnStrByte = cipher.doFinal(strByte);
} catch (IllegalBlockSizeException | BadPaddingException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
returnStr = new String(returnStrByte);
return returnStr;
}
/**
* 密钥生成器
*/
private KeyGenerator keyGenerator;
/**
* 对称密钥
* */
private SecretKey key;
/**
* 加解密时的初始化向量 8bytes
* */
private IvParameterSpec iv;
/**
* cipher
* */
private Cipher cipher;
}
java 对象加密_java.security包实现对象加密相关推荐
- java实例拷贝,Apache Commons包 BeanUtils 对象拷贝实例demo
Apache Commons包 BeanUtils 对象拷贝实例demo 发布时间:2019-05-08作者:laosun阅读(1846) Apache Commons包 BeanUtils 对象拷贝 ...
- java并发常量_Java并发编程-常量对象(七)
在创建后状态不再发生改变的对象称作常量对象(Immutable Objects).常量对象其可靠性使其广泛地用作开发简单可靠代码的策略.常量对象在开发并发程序中非常有用.由于创建后不能被改变状态,它们 ...
- java数据成员_Java基础教程之对象的方法与数据成员
在Java基础教程之从Hello World到面向对象一文中,我们初步了解了对象(object).对象中的数据成员表示对象的状态.对象可以执行方法,表示特定的动作. 此外,我们还了解了类(class) ...
- java war目录_java war包 路径--解决war包中文件路径问题
https://blog.csdn.net/u013409283/article/details/51480948 转自:http://free-chenwei.iteye.com/blog/1507 ...
- java.io包对象读写_java.io 包中的____________和____________类主要用于对对象(Object)的读写_学小易找答案...
[多选题]连铸钢水成分控制的要求有( ). [单选题]起动机用直流电动机将电能转化为 [单选题]下列关于我国少数民族传统禁忌的说法中,错误的是( ). [多选题]下列选项中 , 属于表单控件的是 ( ...
- java对象组合_java并发编程(三): 对象的组合
对象的组合: 如何将现有的线程安全组件,组合成我们想要的更大规模的程序. 设计线程安全的类: 设计线程安全类的三个要素: 1.找出构成对象状态的所有变量: 2.找出约束状态变量的不变性条件: 3.建立 ...
- java超类 子类_Java超类引用子类对象的规律
首先,对于JVM实现引用的一个机制是:类实例的引用就是指向一个句柄(handle)的指针,这个句柄就是一堆指针:一个指针指向一块从java堆中为分配出来内存空间:另一个指针指向一张表(实际上这个表格也 ...
- java切割输入流_Java分割流,对象流,参与序列化,分割读取文件,对象输入或输出流等【诗书画唱】...
自己写的题目:用分割流把一个Java文件分割读取,打印出每次读取的内容,要求每次读取打印500个字节. package fenGeLiu; import java.io.*; public class ...
- java全局变量加锁_Java锁Synchronized,对象锁和类锁举例
4. 同步加锁的是对象,而不是代码.因此,如果你的类中有一个同步方法,这个方法可以被两个不同的线程同时执行,只要每个线程自己创建一个的该类的实例即可. 5. 不同的对象实例的synchronized方 ...
最新文章
- Linux下运行C语言程序
- 高通按手机售价收专利费不合理?too 幼稚!
- iphone字体大小设置_Win10电脑桌面上使用的记事本便签软件字体大小怎么调整?...
- apache web_Web发明家预测文化将发生变化,Apache推动一半的互联网发展,等等
- html5声音播放音乐,HTML5 煽情的音乐播放器和音频可视化
- [编织消息框架][消息处理模式]管道模式
- 智能优化算法:鼠群算法
- Java微信公众平台开发(十五)--微信JSSDK的使用
- 阿里云资深技术专家杨皓然:Serverless 是正在发生的未来
- 实验吧-杂项-Only one file(多文件合并、firework多图层图片)
- 爬虫自动定时获取查重结果并将结果发送至指定邮箱
- 彻底删除BootCamp Windows分区和合并到Mac分区中教程
- 以Maya为引擎的小游戏:是男Yin就坚持2K帧
- 习题--答案--22/6/8
- 绘图板应用讲解计算机,如何用数位板在电脑上画画?5个板绘使用技巧分享!...
- 统计检验方法 大全,t -test 检验,Anova 检验,卡方检验,Kolmogorov–Smirnov 检验
- 如何在电脑上装一个虚拟机
- 琴生不等式及其加权形式的证明
- shell综合练习(二)
- 3个月备战政治数学,你成功上岸了么?