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包实现对象加密相关推荐

  1. java实例拷贝,Apache Commons包 BeanUtils 对象拷贝实例demo

    Apache Commons包 BeanUtils 对象拷贝实例demo 发布时间:2019-05-08作者:laosun阅读(1846) Apache Commons包 BeanUtils 对象拷贝 ...

  2. java并发常量_Java并发编程-常量对象(七)

    在创建后状态不再发生改变的对象称作常量对象(Immutable Objects).常量对象其可靠性使其广泛地用作开发简单可靠代码的策略.常量对象在开发并发程序中非常有用.由于创建后不能被改变状态,它们 ...

  3. java数据成员_Java基础教程之对象的方法与数据成员

    在Java基础教程之从Hello World到面向对象一文中,我们初步了解了对象(object).对象中的数据成员表示对象的状态.对象可以执行方法,表示特定的动作. 此外,我们还了解了类(class) ...

  4. java war目录_java war包 路径--解决war包中文件路径问题

    https://blog.csdn.net/u013409283/article/details/51480948 转自:http://free-chenwei.iteye.com/blog/1507 ...

  5. java.io包对象读写_java.io 包中的____________和____________类主要用于对对象(Object)的读写_学小易找答案...

    [多选题]连铸钢水成分控制的要求有( ). [单选题]起动机用直流电动机将电能转化为 [单选题]下列关于我国少数民族传统禁忌的说法中,错误的是( ). [多选题]下列选项中 , 属于表单控件的是 ( ...

  6. java对象组合_java并发编程(三): 对象的组合

    对象的组合: 如何将现有的线程安全组件,组合成我们想要的更大规模的程序. 设计线程安全的类: 设计线程安全类的三个要素: 1.找出构成对象状态的所有变量: 2.找出约束状态变量的不变性条件: 3.建立 ...

  7. java超类 子类_Java超类引用子类对象的规律

    首先,对于JVM实现引用的一个机制是:类实例的引用就是指向一个句柄(handle)的指针,这个句柄就是一堆指针:一个指针指向一块从java堆中为分配出来内存空间:另一个指针指向一张表(实际上这个表格也 ...

  8. java切割输入流_Java分割流,对象流,参与序列化,分割读取文件,对象输入或输出流等【诗书画唱】...

    自己写的题目:用分割流把一个Java文件分割读取,打印出每次读取的内容,要求每次读取打印500个字节. package fenGeLiu; import java.io.*; public class ...

  9. java全局变量加锁_Java锁Synchronized,对象锁和类锁举例

    4. 同步加锁的是对象,而不是代码.因此,如果你的类中有一个同步方法,这个方法可以被两个不同的线程同时执行,只要每个线程自己创建一个的该类的实例即可. 5. 不同的对象实例的synchronized方 ...

最新文章

  1. Linux下运行C语言程序
  2. 高通按手机售价收专利费不合理?too 幼稚!
  3. iphone字体大小设置_Win10电脑桌面上使用的记事本便签软件字体大小怎么调整?...
  4. apache web_Web发明家预测文化将发生变化,Apache推动一半的互联网发展,等等
  5. html5声音播放音乐,HTML5 煽情的音乐播放器和音频可视化
  6. [编织消息框架][消息处理模式]管道模式
  7. 智能优化算法:鼠群算法
  8. Java微信公众平台开发(十五)--微信JSSDK的使用
  9. 阿里云资深技术专家杨皓然:Serverless 是正在发生的未来
  10. 实验吧-杂项-Only one file(多文件合并、firework多图层图片)
  11. 爬虫自动定时获取查重结果并将结果发送至指定邮箱
  12. 彻底删除BootCamp Windows分区和合并到Mac分区中教程
  13. 以Maya为引擎的小游戏:是男Yin就坚持2K帧
  14. 习题--答案--22/6/8
  15. 绘图板应用讲解计算机,如何用数位板在电脑上画画?5个板绘使用技巧分享!...
  16. 统计检验方法 大全,t -test 检验,Anova 检验,卡方检验,Kolmogorov–Smirnov 检验
  17. 如何在电脑上装一个虚拟机
  18. 琴生不等式及其加权形式的证明
  19. shell综合练习(二)
  20. 3个月备战政治数学,你成功上岸了么?

热门文章

  1. python -m xxx.py和python xxx.py的区别
  2. Silverlight Blend动画设计系列八:拖放(Drag-Drop)操作与拖放行为(DragBehavior)
  3. Docker在Ubuntu16.04上安装
  4. USACO 06JAN 牛的舞会 洛谷2863
  5. poj 2484 A Funny Game
  6. 手机界面常见的的九宫格
  7. 前端开发一些很有用的工具
  8. gdb 调试 TuMediaService
  9. 算法:输入一个链表,输出该链表中倒数第k个结点。
  10. 驱动开发之 设备读写方式:缓冲区方式