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