MD5摘要混合随机盐生成密文之加密算法

7次阅读

共计 1851 个字符,预计需要花费 5 分钟才能阅读完成。

加密步骤:
  • 编写 extractSalt()方法, 该方法可生成返回一个随机盐值.
  • 编写生成 MD5 摘要方法:getMd5Hex(String
    str), 参数为 String, 返回 32 位 hex 字符串. 该方法需导入 jar 包:commons-codec-1.10.jar.
  • 编写密码生成方法:generateKeywordText(String pwd,String
    salt), 在 generateKeywordText()方法中, 获得 getMd5Hex(salt+pwd)返回之字符串 hexs, 新建 48 位 char 数组 cs, 通过 for 循环, 分别截取 hexs 和 salt 自定义规律位置之单字符, 然后一一赋予 cs, 将 cs 转为字符串 os,os 即为最终密码原文.
解密步骤
  • 编写方法 verify(String pass,String origin);
  • verify()方法内, 分别新建 digestChar 字符数组 [32] 和 saltChar 字符数组 [16], 使用 for 循环, 按照之前自定义的位置规律, 从 origin 逆向截取单个字符, 赋予 digestChar[] 和 saltChar[], 将 saltChar[]转为字符串 salt.
  • 最后利用 getMd5Hex(salt+pass)返还的 hexString, 与 new String(digestChar)相比较即可.
Java 代码
  /**
     * 提取盐
     *
     * @return
     */
    public String extractSalt() {Random random = new Random();
        StringBuilder builder = new StringBuilder(16);
        builder.append(random.nextInt(99999999));

        int length = builder.length();

        if (length < 16) {for (int i = 0; i < 16 - length; i++) {int n = random.nextInt(9);
                builder.append(n + "");
            }
        }

        return builder.toString();}

    /**
     * 获取十六进制字符串形式的 MD5 摘要(digest)
     *
     * @param src
     * @return
     */
    private String getMd5Hex(String src) {
        MessageDigest md5 = null;

        try {md5 = MessageDigest.getInstance("MD5");
        } catch (NoSuchAlgorithmException e) {e.printStackTrace();
        }

        byte[] bs = md5.digest(src.getBytes());

        byte[] encode = new Hex().encode(bs);

        return new String(encode);

    }

    /**
     * 代入页面提交的原始密码, 生成并返回密文
     * 
     * @param pwd 原始素材
     * @param salt
     * @return
     */
    public String generateKeywordText(String pwd, String salt) {
        // 撒盐, 并在 MD5hex 方法内均匀搅拌
        String hex = getMd5Hex(salt + pwd);

        char[] cs = new char[48];
        // 再加密
        for (int i = 0; i < 48; i += 3) {cs[i] = hex.charAt(i / 3 * 2);
            cs[i + 1] = salt.charAt(i / 3);
            cs[i + 2] = hex.charAt(i / 3 * 2 + 1);
        }
        
        return new String(cs);

    }

    /**
     * 校验加盐后是否和原文一致, 逆向解密
     *
     * @param password
     *            提交之密码
     * @param text
     *            原文
     * @return
     */
    public boolean verify(String password, String text) {char[] digestStr = new char[32];
        char[] saltStr = new char[16];

        for (int i = 0; i < 48; i += 3) {digestStr[i / 3 * 2] = text.charAt(i);
            digestStr[i / 3 * 2 + 1] = text.charAt(i + 2);

            saltStr[i / 3] = text.charAt(i + 1);
        }

        String salt = new String(saltStr);
        
        boolean b = getMd5Hex(salt + password).equals(new String(digestStr));
        
        return b;
        
    }

正文完
 0