对Java配置文件中敏感信息进行加解密的工具类
在 JavaEE 配置文件中,例如 XML 或者 properties 文件,由于某些敏感信息不希望普通人员看见,则可以采用加密的方式存储,程序读取后进行解密。
常见的如: 数据库用户密码,短信平台用户密码,系统间校验的固定密码等。
本工具类参考了 《Spring.3.x企业应用开发实战》一书 5.3节的实现。
完整代码与注释信息如下:
package com.cncounter.util.comm;
import java.security.Key;
import java.security.SecureRandom;
import javax.crypto.Cipher;
import javax.crypto.KeyGenerator;
import sun.misc.BASE64Decoder;
import sun.misc.BASE64Encoder;
public class DESUtils {
// 密钥
private static Key key;
// KEY种子
private static String KEY_STR = "encrypt@cncounter.com";
// 常量
public static final String UTF_8 = "UTF-8";
public static final String DES = "DES";
// 静态初始化
static{
try {
// KEY 生成器
KeyGenerator generator = KeyGenerator.getInstance(DES);
// 初始化,安全随机算子
generator.init(new SecureRandom( KEY_STR.getBytes(UTF_8) ));
// 生成密钥
key = generator.generateKey();
generator = null;
} catch (Exception e) {
throw new RuntimeException(e);
}
}
/**
* 对源字符串加密,返回 BASE64编码后的加密字符串
* @param source 源字符串,明文
* @return 密文字符串
*/
public static String encode(String source){
try {
// 根据编码格式获取字节数组
byte[] sourceBytes = source.getBytes(UTF_8);
// DES 加密模式
Cipher cipher = Cipher.getInstance(DES);
cipher.init(Cipher.ENCRYPT_MODE, key);
// 加密后的字节数组
byte[] encryptSourceBytes = cipher.doFinal(sourceBytes);
// Base64编码器
BASE64Encoder base64Encoder = new BASE64Encoder();
return base64Encoder.encode(encryptSourceBytes);
} catch (Exception e) {
// throw 也算是一种 return 路径
throw new RuntimeException(e);
}
}
/**
* 对本工具类 encode() 方法加密后的字符串进行解码/解密
* @param encrypted 被加密过的字符串,即密文
* @return 明文字符串
*/
public static String decode(String encrypted){
// Base64解码器
BASE64Decoder base64Decoder = new BASE64Decoder();
try {
// 先进行base64解码
byte[] cryptedBytes = base64Decoder.decodeBuffer(encrypted);
// DES 解密模式
Cipher cipher = Cipher.getInstance(DES);
cipher.init(Cipher.DECRYPT_MODE, key);
// 解码后的字节数组
byte[] decryptStrBytes = cipher.doFinal(cryptedBytes);
// 采用给定编码格式将字节数组变成字符串
return new String(decryptStrBytes, UTF_8);
} catch (Exception e) {
// 这种形式确实适合处理工具类
throw new RuntimeException(e);
}
}
// 单元测试
public static void main(String[] args) {
// 需要加密的字符串
String email = "renfufei@qq.com";
// 加密
String encrypted = DESUtils.encode(email);
// 解密
String decrypted = DESUtils.decode(encrypted);
// 输出结果;
System.out.println("email: " + email);
System.out.println("encrypted: " + encrypted);
System.out.println("decrypted: " + decrypted);
System.out.println("email.equals(decrypted): " + email.equals(decrypted));
}
}
对Java配置文件中敏感信息进行加解密的工具类的更多相关文章
- 其他信息: 具有固定名称“Npgsql”的 ADO.NET 提供程序未在计算机或应用程序配置文件中注册或无法加载。有关详细信息,请参阅内部异常
其他信息: 具有固定名称“Npgsql”的 ADO.NET 提供程序未在计算机或应用程序配置文件中注册或无法加载.有关详细信息,请参阅内部异常 解决方法 在 App.config 的 configur ...
- springboot读取配置文件中的信息
在一个项目中,我们有时候会把一些配置信息写入到一个配置文件中,在java代码中读取配置文件的信息.在此记录下读取属性文件中的内容. 在springboot项目中,springboot的配置文件可以使用 ...
- Java实现RSA密钥对并在加解密、加签验签中应用的实例
一.项目结构 二.代码具体实现 1.密钥对生成的两种方式:一种生成公钥私文件,一种生成公钥私串 KeyPairGenUtil.java package com.wangjinxiang.genkey. ...
- logstash 对配置文件conf敏感信息,密码等加密
logstash的配置文件conf经常会涉及敏感信息,比如ES,mysql的账户密码等,以下使用logstash导入mysql为例子,加密隐藏mysql的密码. 在向keystore中添加key及其s ...
- 单例模式读取properties配置文件中的信息
public class ConfigManager { private static ConfigManager config = null; //创建Properties文件 读取配 ...
- 类库从自带的配置文件中获取信息(DLL文件 获取 DLL文件自带的配置信息) z
http://blog.csdn.net/shuaishifu/article/details/19602059 类库调用自身所带的配置文件中的配置信息,而不是读取应用程序所带的配置信息.代码如下: ...
- java与IOS之间的RSA加解密
很简单的一个需求,ipad端给密码RSA加密,传到java后台,解密.RSA加密算法是基于一个密钥对的,分为公钥和私钥,一般情况公钥加密,私钥解密,但也可私钥加密,公钥解密.还可以验签,就是先用私钥对 ...
- Java 7 中 NIO.2 的使用——第一节 Path 类的使用
路径隶属于文件系统,实际上它是存储和组织媒体文件的格式,通常在一块或多块硬盘设备上,以便于非常容易地检索.文件系统可以通过 java.nio.file.FileSystems 这个final 类来访 ...
- Java文件中为什么只能有一个public修饰的类, 并且类名还必须与文件名相同
当编写一个java源代码文件时,此文件通常被称为编译单元(有时也被称为转译单元).每个编译单元都必须有一个后缀名.java,而在编译单元内则可以有一个public类,该类的名称必须与文件的名称相同(包 ...
随机推荐
- iOS开发基础:最新的APP打包上架流程
之前有人留言让我更新部分文章,下面就为大家分享一下iOS的APP打包上架流程: 上传至apple developer 1.1 上传准备工作 更新上架和发布上架不同,在原始版本首次上架的时候就将描述文件 ...
- java异常拾遗
概述 当方法内部发生一项错误时,该方法会创建一个对象传递给运行时系统(runtime system),这个对象被称为异常对象,包含错误的类型.发生位置,程序状态等一系列信息. 当一个方法抛出异常时,运 ...
- Dynamics CRM2016 Web Api之根据时间查询数据
我的博文里已经有多次提到CRM中的时间处理问题了,本篇继续探讨在web api的场景下时间字段如何处理,本篇只涉及查询,针对2016中新增的时间行为"用户当地时间"和"无 ...
- 如何在控制台切换Xcode的版本
打开控制台,输入 xcode-select -p 你可以看到当前Xcode所使用的版本路径,比如本猫的输出为: /Applications/Xcode-beta.app/Contents/Develo ...
- Swift中如何化简标准库中冗长的类实例初始化代码
可能有些童鞋并不知道,在Swift中缩写点符号对于任何类型的任何static成员都有效. 我们实际写一个例子看一下: import UIKit class CFoo{ static let share ...
- 1.物理系统PhysicsWorld,RayCast
1 3.0物理系统PhysicsWorld T07PhysicsWorld.h #ifndef __T07PhysicsWorld_H__ #define __T07PhysicsWorld_H ...
- java虚拟机 jvm java堆 方法区 java栈
java堆是java应用程序最密切的内存空间.几乎所有的对象都存在堆中.java堆完全自动化管理,通过垃圾回收机制,垃圾对象会自动清理,不需要显式释放. 根据java垃圾回收机制的不同,java堆可能 ...
- Ubuntu和Windows设备共享
http://blog.csdn.net/pipisorry/article/details/51725942 蓝牙设备如键盘.鼠标都可以. 装的双系统win7和Ubuntu,如果只使用一个系统,蓝牙 ...
- 18 UI美化layer-list
layer-list 用于叠加两张图片 或者设置 RatingBar(评分) 进度条 相框等 在工程文件中的res/drawable/新建一个layer-list(叠加两张图片) 如下 : <? ...
- Git管理工具对比(GitBash、EGit、SourceTree)
Git管理工具对比(GitBash.EGit.SourceTree) GitBash是采用命令行的方式对版本进行管理,功能最为灵活强大,但是由于需要手动输入希望修改的文件名,所以相对繁琐. EGit是 ...