zoukankan      html  css  js  c++  java
  • MD5加密

    package AddSalt;
    import java.security.MessageDigest;
    import java.util.Random;
     
    public class MD5Utils {
     
      /**
         * byte[]字节数组 转换成 十六进制字符串
         * 
         * @param arr 要转换的byte[]字节数组
         *
         * @return  String 返回十六进制字符串
         */
         private static String hex(byte[] arr) {
    	     StringBuffer sb = new StringBuffer();
    	     for (int i = 0; i < arr.length; ++i) {
    		     sb.append(Integer.toHexString((arr[i] & 0xFF) | 0x100).substring(1, 3));
    	     }
    	     return sb.toString();
         }
     
     
     
     
       /**
         * MD5加密,并把结果由字节数组转换成十六进制字符串
         * 
         * @param str 要加密的内容
         * 
         * @return String 返回加密后的十六进制字符串
         */
         private static String md5Hex(String str) {
           try {
               MessageDigest md = MessageDigest.getInstance("MD5");
               byte[] digest = md.digest(str.getBytes());
               return hex(digest);
           } catch (Exception e) {
               e.printStackTrace();
               System.out.println(e.toString());
               return "";
           }
         }
     
     
     
       /**
         * 生成含有随机盐的密码
         *
         * @param password 要加密的密码
         *
         * @return String 含有随机盐的密码
         */
         public static String getSaltMD5(String password) {
    		// 生成一个16位的随机数
            Random random = new Random();
            StringBuilder sBuilder = new StringBuilder(16);
            sBuilder.append(random.nextInt(99999999)).append(random.nextInt(99999999));
            int len = sBuilder.length();
            if (len < 16) {
                  for (int i = 0; i < 16 - len; i++) {
                    sBuilder.append("0");
                }
            }
            // 生成最终的加密盐
            String salt = sBuilder.toString();
            password = md5Hex(password + salt);
            char[] cs = new char[48];
            for (int i = 0; i < 48; i += 3) {
                cs[i] = password.charAt(i / 3 * 2);
                char c = salt.charAt(i / 3);
                cs[i + 1] = c;
                cs[i + 2] = password.charAt(i / 3 * 2 + 1);
            }
            System.out.println("String.valueOf(cs)======="+String.valueOf(cs));
            return String.valueOf(cs);
         }
     
     
     
       /**
         * 验证加盐后是否和原密码一致
         * 
         * @param password 原密码
         * 
         * @param password 加密之后的密码
         * 
         *@return boolean true表示和原密码一致   false表示和原密码不一致
         */
         public static boolean getSaltverifyMD5(String password, String md5str) {
            char[] cs1 = new char[32];
            char[] cs2 = new char[16];
            for (int i = 0; i < 48; i += 3) {
                cs1[i / 3 * 2] = md5str.charAt(i);
                cs1[i / 3 * 2 + 1] = md5str.charAt(i + 2);
                cs2[i / 3] = md5str.charAt(i + 1);
            }
           
            String Salt = new String(cs2);
            return md5Hex(password + Salt).equals(String.valueOf(cs1));
         }
     
     
        
        public static void main(String[] args) {
            // 原密码
            String plaintext = "123456";
     
            // 获取加盐后的MD5值
            String ciphertext = MD5Utils.getSaltMD5(plaintext);
            System.out.println("加盐后MD5:" + ciphertext);
            System.out.println("是否是同一字符串:" + MD5Utils.getSaltverifyMD5(plaintext, ciphertext));
        }
    }
    

      

  • 相关阅读:
    怎么判断自己在不在一家好公司?
    超全!互联网大厂的薪资和职级一览
    Nginx 又一牛 X 功能!流量拷贝
    时间管理之四象限法则
    罗永浩一个坑位卖60万脏钱背后:放下面子赚钱,才是成年人最大的体面
    2020 年 4月全国程序员工资出炉
    一次 SQL 查询优化原理分析(900W+ 数据,从 17s 到 300ms)
    “Hey Siri” 背后的黑科技大揭秘!
    一文讲透高薪的本质!
    python UnicodeDecodeError: 'gbk' codec can't decode byte 0x99 in position 87: illegal multibyte sequence异常解决
  • 原文地址:https://www.cnblogs.com/xianz666/p/14605985.html
Copyright © 2011-2022 走看看