博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
java.security包实现对象加密
阅读量:7090 次
发布时间:2019-06-28

本文共 4650 字,大约阅读时间需要 15 分钟。

hot3.png

    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;}

转载于:https://my.oschina.net/u/1404252/blog/185421

你可能感兴趣的文章
Greenplum同步到Oracle脚本
查看>>
Tomcat 不同端口配置两个应用程序
查看>>
XMLDecoder反序列化漏洞
查看>>
【.net web】Response.Redirect 打开新窗口的两种方法
查看>>
多从库时半同步复制不工作的BUG分析
查看>>
IOS像素与分辨率
查看>>
swig 基于neko vm的类型包装
查看>>
Dubbo学习(一)
查看>>
我的友情链接
查看>>
类的继承
查看>>
Objective-C消息发送和消息转发机制
查看>>
Quartz 开源任务调度框架
查看>>
SASS界面编译工具——Koala的使用
查看>>
JSP放入Jar包支持
查看>>
润乾报表使用json数据源的方法改进
查看>>
小蚂蚁学习PS切图之基础操作(2)——工具栏的介绍
查看>>
【Mybatis】- sqlSession工作流程
查看>>
mysql str_to_date字符串转换为日期
查看>>
jsp---EL运算符
查看>>
剥去中国崛起的外衣(画皮)!
查看>>