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

加密步骤:
  • 编写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;
        
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章