您的位置:首页 > 编程语言 > Java开发

Java生成MD5加密字符串代码实例

2016-09-06 19:54 190 查看

 

MD5是什么?

 

      MD5是message-digest algorithm 5(信息-摘要算法)的缩写,是一种计算机安全领域使用的一种散列函数,被广泛应用于加密和解密的技术上,它就像文件的“数字指纹”。

   不管是可执行的程序、图像文件、临时文件还是其他类型的文件,都有其唯一对应的的MD5信息值。就像人的基因一样,不同的人,基因不一样。

 

MD5的作用:

 

     1、通过同一个文件的MD5值,可以赖检验这个文件是否被“篡改”过。我们常常会遇到这样一个问题,下载的东西的时候,有时候下载的东西并不是我们想要的或者是有病毒,病毒可以查杀,但文件被修改了,有时候,你自己是察觉不到的。这就可以通过MD5值来校验(一般正规的网站都会提供文件的MD5值)。

 

     2、MD5还用于操作系统的登录认证上,比如Unix.当用户登录的时候,系统将用户输入的密码以MD5进行一套算法运算,然后去和保存在文件系统中的MD5值进行比较,确定密码是否正确。

 

      MD5的值是无法被变换成原始字符串的。因为MD5将任意长度的“字符串”映射为一个128bit的大整数,然而通过128bit的大整数反推原始字符串是很难的。

 

     破译MD5是要用到一种叫做鸽巢原理的东西,用它来破解MD5,要创建N多个文件,从其中找出MD5相同的文件,但找出的文件的MD5相同内容不一定相同的。对于文件来说,MD5还是相当的安全,但是对于密码就一定了,如果两个人的密码的MD5相同,如果一个人的密码是a,那么另外一个人就可以用MD5相同的密码b直接登录他的账号,直接盗号。

<script type="text/javascript">// <![CDATA[ /*iteye博客内页Banner-468*60,创建于2016-5-31*/ var cpro_id = "u1405021"; // ]]></script><script type="text/javascript" src="http://cpro.baidustatic.com/cpro/ui/c.js"></script>

(1)一般使用的数据库中都会保存用户名和密码,其中密码不使用明码保存。

      有时候用MD5密码,很多语言都提供了将字符串生成为MD5密码的方法或函数。MD5的加密算法是公开的。

      有时候也可以用自己的字符串加密算法,这种加密算法是只有自己知道的。

(2)破解MD5的过程就是先算好大量或者所有可能的字符串的MD5数值,之后进行查询就可以破解。虽然有些网站规定了密码的位数在6~20位之间,但是要事先计算这么多是字符串并有效的组织存储、查询还是相当麻烦,相当慢   的。

    因为MD5的位数是固定的,比如16,32,64,而字符串的组合与长度是无穷尽的,这就有冲突啦。但是如果知道了加密前字符串的长度是有固定范围的,比如6~20,这个还是可以破解的。

    但是,如果不知道加密前字符的长度那么这就是无穷尽啦。貌似现在还没有人能够破解吧。

       MD5密码破解网站 :可以百度搜索“MD5解密

(3)下面给出了一个java生成给定字符串的MD5密码的模块程序。

 

import java.security.MessageDigest;

public class Md5Test {
public void toMD5(String plainText) {
try {
//生成实现指定摘要算法的 MessageDigest 对象。
MessageDigest md = MessageDigest.getInstance("MD5");
//使用指定的字节数组更新摘要。
md.update(plainText.getBytes());
//通过执行诸如填充之类的最终操作完成哈希计算。
byte b[] = md.digest();
//生成具体的md5密码到buf数组
int i;
StringBuffer buf = new StringBuffer("");
for (int offset = 0; offset < b.length; offset++) {
i = b[offset];
if (i < 0)
i += 256;
if (i < 16)
buf.append("0");
buf.append(Integer.toHexString(i));
}
System.out.println("32位: " + buf.toString());// 32位的加密
System.out.println("16位: " + buf.toString().substring(8, 24));// 16位的加密,其实就是32位加密后的截取
}
catch (Exception e) {
e.printStackTrace();
}
}

public static void main(String agrs[]) {
new Md5Test().toMD5("LXD");//加密LXD
System.out.println("加密源码:LXD");
}
}

 

 

 

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: