浅谈MD5加密算法(JAVA实现)

MD5是一个安全的散列算法,输入两个不同的明文不会得到相同的输出值,根据输出值,不能得到原始的明文,即其过程不可逆,常用于用户注册口令的加密。

实例下载

        MD5是一个安全的散列算法,输入两个不同的明文不会得到相同的输出值,根据输出值,不能得到原始的明文,即其过程不可逆;所以要解密MD5没有现成的算法,只能用穷举法,把可能出现的明文,用MD5算法散列之后,把得到的散列值和原始的数据形成一个一对一的映射表,通过比在表中比破解密码的MD5算法散列值,通过匹配从映射表中找出破解密码所对应的原始明文。

对信息系统或者网站系统来说,MD5算法主要用在用户注册口令的加密,对于普通强度的口令加密,可以通过以下三种方式进行破解:

(1)在线查询密码。一些在线的MD5值查询网站提供MD5密码值的查询,输入MD5密码值后,如果在数据库中存在,那么可以很快获取其密码值。

(2)使用MD5破解工具。网络上有许多针对MD5破解的专用软件,通过设置字典来进行破解。

(3)通过社会工程学来获取或者重新设置用户的口令。

因此简单的MD5加密是没有办法达到绝对的安全的,因为普通的MD5加密有多种暴力破解方式,因此如果想要保证信息系统或者网站的安全,需要对MD5进行改造,增强其安全性,本文就是在MD5加密算法的基础上进行改进!

1、MD5算法应用

        MD5加密算法由于其具有较好的安全性,加之商业也可以免费使用该算法,因此该加密算法被广泛使用,md5算法主要运用在数字签名、文件完整性验证以及口令加密等方面。        

        举个简单列子,文本内容加密:

复制代码

/**
     * simple MD5
     * 
     * @param text
     * @return
     */
    public static String simpleMD5(String text) {
        try {
 
            MessageDigest digest = MessageDigest.getInstance("MD5");
 
            digest.update(text.getBytes());
 
            return encodeHex(digest.digest());
 
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

复制代码

2、MD5的安全性

MD5以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。从安全的角度讲,MD5的输出为128位,若采用纯强力攻击寻找一个消息具有给定Hash值的计算困难性为2128,用每秒可试验1000000000个消息的计算机需时1.07×1022年。若采用生日攻击法,寻找有相同Hash值的两个消息需要试验264个消息,用每秒可试验1000000000个消息的计算机需时585年。

3、基于MD5加密算法改进

上列对文本内容的加密过程过于简单,可能会被MD5破解工具破解,因此可以对传入的内容加点料,以此增加破解难度,其加密过程用算法描述如下:

    (1)传入明文password同时传入salt

    (2)组合内容,再加点特殊字符 salt+"#$@$%"+password

    (3)变换后的密码值为encrypt_password=(salt+"#$@$%"+password)

解密过程跟加密过程一样,先对输入的明文加密,接着从数据库读出密文密码,二者相等,即可继续业务操作。

4、关键代码实现(源码见附件)

复制代码

/**
     * 
     * @param salt
     * @param text
     * @return
     */
    public static String encryptMD5(String salt, String text) {
 
        try {
 
            MessageDigest digest = MessageDigest.getInstance("MD5");
 
            String toEncryp = salt + "@$#" + text;
 
            digest.update(toEncryp.getBytes());
 
            return encodeHex(digest.digest());
 
        } catch (Exception e) {
            throw new RuntimeException(e);
        }

复制代码

猜你喜欢

转载自my.oschina.net/u/3743971/blog/1790757