• 对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));
    	}
    }

  • 相关阅读:
    网易在帮助我们泄漏密码吗?
    ADC转换参数——INL_DNL
    高速ADC的关键指标:量化误差、offset/gain error、DNL、INL、ENOB、分辨率、RMS、SFDR、THD、SINAD、dBFS、TWOTONE IMD
    Altium Designer如何批量修改名称,数值,封装,NET颜色
    MAC和PHY的区别
    以太网,IP,TCP,UDP数据包分析
    《西安JAVA培训教学视频西安云工厂旺旺老师》更新struts1.SQLServer.设计模式.JavaScript.JavaWeb
    在DOS命令下写一个简单的HelloWorld程序
    你想遇到什么样的人,你先要成为什么样的人
    一些重要的shell命令
  • 原文地址:https://www.cnblogs.com/lanzhi/p/6467029.html
Copyright © 2020-2023  润新知