- package * **;
- import com.ncf.rcms.util.impl.UtilServiceImpl;
- import lombok.extern.slf4j.Slf4j;
- import sun.misc.BASE64Decoder;
- import sun.misc.BASE64Encoder;
- import javax.crypto.Cipher;
- import javax.crypto.KeyGenerator;
- import javax.crypto.SecretKey;
- import javax.crypto.spec.SecretKeySpec;
- import java.security.MessageDigest;
- import java.security.NoSuchAlgorithmException;
- import java.security.SecureRandom;@Slf4j public class PasswordUtil {
- private static final char[] HEX_DIGITS = {
- 0,
- 1,
- 2,
- 3,
- 4,
- 5,
- 6,
- 7,
- 8,
- 9,
- a,
- b,
- c,
- d,
- e,
- f
- };
- public static String MD5(String passwordInPlainText) {
- try {
- MessageDigest mdTemp = MessageDigest.getInstance("MD5");
- mdTemp.update(passwordInPlainText.getBytes("utf-8"));
- byte[] md = mdTemp.digest();
- char[] str = new char[md.length << 1];
- int k = 0;
- for (byte byte0: md) {
- str[k++] = HEX_DIGITS[byte0 >>> 4 & 0xf];
- str[k++] = HEX_DIGITS[byte0 & 0xf];
- }
- return new String(str);
- } catch(Exception e) {
- return null;
- }
- }
- public static String MD5forRequest(String content) {
- MessageDigest md5;
- try {
- md5 = MessageDigest.getInstance("MD5");
- } catch(NoSuchAlgorithmException e) {
- // TODO Auto-generated catch block
- return null;
- }
- md5.update(content.getBytes());
- byte[] domain = md5.digest();
- StringBuffer md5StrBuff = new StringBuffer();
- // converting domain to String
- for (int i = 0; i < domain.length; ++i) {
- if (Integer.toHexString(0xFF & domain[i]).length() == 1) {
- md5StrBuff.append("0").append(Integer.toHexString(0xFF & domain[i]));
- } else md5StrBuff.append(Integer.toHexString(0xFF & domain[i]));
- }
- return md5StrBuff.toString();
- }
- public static String generateRandomSalt() {
- return ApplicationContextHolder.getBean(UtilServiceImpl.class).generateKey(9999, 24);
- }
- /*
- * 加密
- * 1. 构造密钥生成器
- * 2. 根据 ecnodeRules 规则初始化密钥生成器
- * 3. 产生密钥
- * 4. 创建和初始化密码器
- * 5. 内容加密
- * 6. 返回字符串
- */
- public static String AESEncode(String encodeRules, String content) {
- try {
- //1. 构造密钥生成器, 指定为 AES 算法, 不区分大小写
- KeyGenerator keygen = KeyGenerator.getInstance("AES");
- //2. 根据 ecnodeRules 规则初始化密钥生成器
- // 生成一个 128 位的随机源, 根据传入的字节数组
- SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
- secureRandom.setSeed(encodeRules.getBytes());
- keygen.init(128, secureRandom);
- //3. 产生原始对称密钥
- SecretKey original_key = keygen.generateKey();
- //4. 获得原始对称密钥的字节数组
- byte[] raw = original_key.getEncoded();
- //5. 根据字节数组生成 AES 密钥
- SecretKey key = new SecretKeySpec(raw, "AES");
- //6. 根据指定算法 AES 自成密码器
- Cipher cipher = Cipher.getInstance("AES");
- //7. 初始化密码器, 第一个参数为加密 (Encrypt_mode) 或者解密解密 (Decrypt_mode) 操作, 第二个参数为使用的 KEY
- cipher.init(Cipher.ENCRYPT_MODE, key);
- //8. 获取加密内容的字节数组 (这里要设置为 utf-8) 不然内容中如果有中文和英文混合中文就会解密为乱码
- byte[] byte_encode = content.getBytes("utf-8");
- //9. 根据密码器的初始化方式 -- 加密: 将数据加密
- byte[] byte_AES = cipher.doFinal(byte_encode);
- //10. 将加密后的数据转换为字符串
- // 这里用 Base64Encoder 中会找不到包
- // 解决办法:
- // 在项目的 Build path 中先移除 JRE System Library, 再添加库 JRE System Library, 重新编译后就一切正常了
- String AES_encode = new String(new BASE64Encoder().encode(byte_AES));
- //11. 将字符串返回
- return AES_encode;
- } catch(Exception e) {
- e.printStackTrace();
- }
- // 如果有错就返加 null
- return null;
- }
- /*
- * 解密
- * 解密过程:
- * 1. 同加密 1-4 步
- * 2. 将加密后的字符串反纺成 byte[]数组
- * 3. 将加密内容解密
- */
- public static String AESDecode(String encodeRules, String content) {
- try {
- log.info("encodeRules:{},content:{}", encodeRules, content);
- //1. 构造密钥生成器, 指定为 AES 算法, 不区分大小写
- KeyGenerator keygen = KeyGenerator.getInstance("AES");
- //2. 根据 ecnodeRules 规则初始化密钥生成器
- // 生成一个 128 位的随机源, 根据传入的字节数组
- SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
- secureRandom.setSeed(encodeRules.getBytes());
- keygen.init(128, secureRandom);
- //3. 产生原始对称密钥
- SecretKey original_key = keygen.generateKey();
- //4. 获得原始对称密钥的字节数组
- byte[] raw = original_key.getEncoded();
- //5. 根据字节数组生成 AES 密钥
- SecretKey key = new SecretKeySpec(raw, "AES");
- //6. 根据指定算法 AES 自成密码器
- Cipher cipher = Cipher.getInstance("AES");
- //7. 初始化密码器, 第一个参数为加密 (Encrypt_mode) 或者解密 (Decrypt_mode) 操作, 第二个参数为使用的 KEY
- cipher.init(Cipher.DECRYPT_MODE, key);
- //8. 将加密并编码后的内容解码成字节数组
- byte[] byte_content = new BASE64Decoder().decodeBuffer(content);
- /*
- * 解密
- */
- byte[] byte_decode = cipher.doFinal(byte_content);
- String AES_decode = new String(byte_decode, "utf-8");
- return AES_decode;
- } catch(Exception e) {
- log.info("Exception:{}", e.getMessage());
- e.printStackTrace();
- }
- // 如果有错就返加 null
- return null;
- }
- }
- SecureRandom secureRandom = SecureRandom.getInstance("SHA1PRNG");
- secureRandom.setSeed(encodeRules.getBytes());
- keygen.init(128, secureRandom);
解决 Linux,window 系统差异
来源: http://www.bubuko.com/infodetail-2536555.html