加密步骤:
  • 编写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;            }