[Java] 生成一个固定位数的随机字符串,并加密,和用户密码加密后的密文组合 →→→→→进入此内容的聊天室

来自 , 2021-01-08, 写在 Java, 查看 113 次.
URL http://www.code666.cn/view/0d4f4805
  1. import java.io.UnsupportedEncodingException;
  2. import java.security.MessageDigest;
  3. import java.security.NoSuchAlgorithmException;
  4. import java.security.SecureRandom;
  5. import java.util.Arrays;
  6.  
  7. /**
  8.  * 生成一个固定位数的随机字符串,并加密,和用户密码加密后的密文组合
  9.  *
  10.  */
  11. public class PasswordUtil {
  12.  
  13.         // 16进制需要的字符串数据
  14.         private static final String HEX_NUMS_STR = "0123456789ABCDEF";
  15.  
  16.         // 随机字符串字节数长度
  17.         private static final Integer BYTE_LENGTH = 16;
  18.  
  19.         /**
  20.          * 将16进制字符串转换成字节数组
  21.          *
  22.          * @param hex
  23.          * @return
  24.          */
  25.         public static byte[] hexStringToByte(String hex) {
  26.                 int len = (hex.length() / 2);
  27.                 byte[] result = new byte[len];
  28.                 char[] hexChars = hex.toCharArray();
  29.                 for (int i = 0; i < len; i++) {
  30.                         int pos = i * 2;
  31.                         result[i] = (byte) (HEX_NUMS_STR.indexOf(hexChars[pos]) << 4 | HEX_NUMS_STR
  32.                                         .indexOf(hexChars[pos + 1]));
  33.                 }
  34.                 return result;
  35.         }
  36.  
  37.         /**
  38.          * 将指定byte数组转换成16进制字符串
  39.          *
  40.          * @param b
  41.          * @return
  42.          */
  43.         public static String byteToHexString(byte[] b) {
  44.                 StringBuffer hexString = new StringBuffer();
  45.                 for (int i = 0; i < b.length; i++) {
  46.                         String hex = Integer.toHexString(b[i] & 0xFF);
  47.                         if (hex.length() == 1) {
  48.                                 hex = '0' + hex;
  49.                         }
  50.                         hexString.append(hex.toUpperCase());
  51.                 }
  52.                 return hexString.toString();
  53.         }
  54.  
  55.         /**
  56.          * 验证口令是否合法
  57.          *
  58.          * @param inputStr
  59.          * @param strWithRandom
  60.          * @return
  61.          * @throws NoSuchAlgorithmException
  62.          * @throws UnsupportedEncodingException
  63.          */
  64.         public static boolean validPassword(String inputStr, String strWithRandom) {
  65.                 boolean flag = false;
  66.                 try {
  67.                         // 将16进制字符串格式口令转换成字节数组
  68.                         byte[] pwdInDb = hexStringToByte(strWithRandom);
  69.                         // 声明一个随机数组变量
  70.                         byte[] randomByte = new byte[BYTE_LENGTH];
  71.                         // 将随机数组从数据库中保存的口令字节数组中提取出来,按其长度
  72.                         System.arraycopy(pwdInDb, 0, randomByte, 0, BYTE_LENGTH);
  73.                         // 创建消息摘要对象
  74.                         MessageDigest md = MessageDigest.getInstance("MD5");
  75.                         // 将随机数组据传入消息摘要对象
  76.                         md.update(randomByte);
  77.                         // 将口令的数据传给消息摘要对象
  78.                         md.update(inputStr.getBytes("UTF-8"));
  79.                         // 生成输入口令的消息摘要
  80.                         byte[] digest = md.digest();
  81.                         // 声明一个保存数据库中口令消息摘要的变量
  82.                         byte[] digestInDb = new byte[pwdInDb.length - BYTE_LENGTH];
  83.                         // 取得数据库中口令的消息摘要
  84.                         System.arraycopy(pwdInDb, BYTE_LENGTH, digestInDb, 0,
  85.                                         digestInDb.length);
  86.                         // 比较根据输入口令生成的消息摘要和数据库中消息摘要是否相同
  87.                         if (Arrays.equals(digest, digestInDb)) {
  88.                                 // 口令正确返回口令匹配消息
  89.                                 flag = true;
  90.                         }
  91.                 } catch (NoSuchAlgorithmException e) {
  92.                         e.printStackTrace();
  93.                 } catch (UnsupportedEncodingException e) {
  94.                         e.printStackTrace();
  95.                 }
  96.                 return flag;
  97.         }
  98.  
  99.         /**
  100.          * 获得加密后的16进制形式口令
  101.          *
  102.          * @param password
  103.          * @return
  104.          * @throws NoSuchAlgorithmException
  105.          * @throws UnsupportedEncodingException
  106.          */
  107.         public static String MD5(String password) {
  108.                 // 声明加密后的口令数组变量
  109.                 byte[] pwd = null;
  110.                 // 随机数生成器
  111.                 SecureRandom random = new SecureRandom();
  112.                 // 声明随机数组变量
  113.                 byte[] randomByte = new byte[BYTE_LENGTH];
  114.                 try {
  115.                         // 将随机数放入随机数组变量中
  116.                         //用随机数填充指定字节数组的元素。
  117.                         random.nextBytes(randomByte);
  118.  
  119.                         // 声明消息摘要对象
  120.                         MessageDigest md = null;
  121.                         // 创建消息摘要
  122.                         md = MessageDigest.getInstance("MD5");
  123.                         // 将盐数据传入消息摘要对象
  124.                         md.update(randomByte);
  125.                         // 将口令的数据传给消息摘要对象
  126.                         md.update(password.getBytes("UTF-8"));
  127.                         // 获得消息摘要的字节数组
  128.                         byte[] digest = md.digest();
  129.  
  130.                         // 因为要在口令的字节数组中存放随机数组密文,所以加上随机数组的字节长度
  131.                         pwd = new byte[digest.length + BYTE_LENGTH];
  132.                         // 将盐的字节拷贝到生成的加密口令字节数组的前相应该长度BYTE_LENGTH个字节,以便在验证口令时取出随机数组
  133.                         System.arraycopy(randomByte, 0, pwd, 0, BYTE_LENGTH);
  134.                         // 将消息摘要拷贝到加密口令字节数组从第BYTE_LENGTH个字节开始的字节
  135.                         System.arraycopy(digest, 0, pwd, BYTE_LENGTH, digest.length);
  136.                         // 将字节数组格式加密后的口令转化为16进制字符串格式的口令
  137.                 } catch (NoSuchAlgorithmException e) {
  138.                         e.printStackTrace();
  139.                 } catch (UnsupportedEncodingException e) {
  140.                         e.printStackTrace();
  141.                 }
  142.  
  143.                 if (pwd != null) {
  144.                         return byteToHexString(pwd);
  145.                 }
  146.  
  147.                 return null;
  148.         }
  149.  
  150. }
  151.  

回复 "生成一个固定位数的随机字符串,并加密,和用户密码加密后的密文组合"

这儿你可以回复上面这条便签

captcha