您好,欢迎来到三六零分类信息网!老站,搜索引擎当天收录,欢迎发信息

java MD5加密算法

2025/12/11 20:49:18发布26次查看
md5(message digest algorithm 5),翻译过来是消息摘要算法第五版,按照惯例,我们推理可能也有md2,md3这样名字的历史版本..
即使完全不了解这个算法的原理,我们也可以从命名中看出一些眉道,所谓摘要,就是一个简短的概括,像我写过的毕业论文,上来第一部分就是摘要,它对后面长篇大论的文章做了一个简短有力的概括,其实md5的作用也有点这样的味道,我们来看一段关于描述md5算法作用的文字:
md5的作用是让大容量信息在用数字签名软件签署私人密匙前被”压缩”成一种保密的格式(就是把一个任意长度的字节串变换成一定长的大整数),它主要用于确保数据传输的完整性和一致性.
假设a要给远方的b发送一个文本文件,有100万字,当b收到文件的时候,该怎么知道这个文件在传过来的途中有没有被篡改呢,要是有人中途截断并篡改了文件内容那就不太妙了,这时候md5就派上用场了,不管多大的文件,通过md5加密之后都会得到一个定长的字符串,一般是32位,这时候a先对文件用md5加密一下,得到的一串密文顺便也传给b,当b收到后文件,同样对文件用md5加密一下,看看得到的密文是否和a传过来的一致,如果一致,说明这个文件是安全的.这样就确保了数据传输的完整性.
事实上,我们从网络上下载文件的时候,有时候下载的文件后面都有一段md5的密文,比如 md5(e8027a87676ea48b3a3c9b0a4d8d87a0),作用和上面我举得例子类似(我觉得是这样….).
md5是一种公开的不可逆的算法,意味着是没有办法直接破解密文得到源数据信息的,md5可以对一个对一个任意大小的文件进行加密运算,得到一个唯一的32位字符串.
简单了解了md5的功能,就可以直接看代码了.
java代码实现md5加密 
复制代码 
package com.wang.encryption; 
import com.sun.org.apache.xerces.internal.impl.dv.util.base64; 
import java.security.messagedigest; 
/** 
* @author yogo.wang 
* @date 2016/11/04-下午1:02. 
*/ 
public class md5test { 
public static string md5encode(string msg) throws exception{
byte[] msgbytes = msg.getbytes("utf-8"); /** * 声明使用md5算法,获得messadigest对象 */ messagedigest md5 = messagedigest.getinstance("md5"); /** * 使用指定的字节更新摘要 */ md5.update(msgbytes); /** * 完成哈希计算,获得密文 */ byte[] digest = md5.digest(); /** * 以上两行代码等同于 byte[] digest = md5.digest(msgbytes); */ return bytestohexstring(digest); } /** * 将byte数组转化为16进制字符串形式 * @param bys * @return */ public static string bytearr2hexstring(byte[] bys){ stringbuffer hexval=new stringbuffer(); int val=0; for (int i = 0; i < bys.length; i++) { //将byte转化为int 如果byte是一个负数就必须要和16进制的0xff做一次与运算 val=((int)bys[i]) & 0xff; if(val<16){ hexval.append("0"); } hexval.append(integer.tohexstring(val)); } return hexval.tostring(); } public static void main(string[] args) throws exception { string msg="helloworld"; string result=md5encode(msg); string result1=md5encode(msg); system.out.println(result); system.out.println(result1); }
}
复制代码
运行代码,得到的输出结果如下:
fc5e038d38a57032085441e7fe7010b0
fc5e038d38a57032085441e7fe7010b0
可见,对同一个字段进行加密,得到的密文总是一致的.接下来看一下md5实现的原理和应用.
md5实现原理及应用
我看了一些网上的朋友自己实现的md5加密的代码,只能说半知半解,这里贴一下,网络上的一些实现的步骤介绍(随便看看就好).
md5算法的原理主要分为以下几个步骤,
1)填充:首先将输入信息的长度(bit)进行填充,使得对512求余的结果等于448。填充的方法是填充一个1和n个0。
2)记录信息长度:用64位来存储填充前信息长度。这64位加在第一步结果的后面,这样信息长度就变为n*512+448+64=(n+1)*512位。
3)装入标准的幻数:标准的幻数是(a=(01234567)16,b=(89abcdef)16,c=(fedcba98)16,d=(76543210)16)。如果在程序中定义应该是(a=0x67452301l,b=0xefcdab89l,c=0x98badcfel,d=0x10325476l)。
4)四轮循环运算:循环的次数是分组的个数(n+1)。
这里主要介绍一下,java中messagedigest这个类,查看jdk的开发文档,可以看到该类位于java.security包下,文档对messagedigest的描述如下:
public abstract class messagedigest
extends messagedigestspi 此 messagedigest 类为应用程序提供信息摘要算法的功能,如 md5 或 sha 算法。信息摘要是安全的单向哈希函数,它接收任意大小的数据,输出固定长度的哈希值。 messagedigest 对象开始被初始化。该对象通过使用 update 方法处理数据。任何时候都可以调用 reset 方法重置摘要。一旦所有需要更新的数据都已经被更新了,应该调用 digest 方法之一完成哈希计算。 对于给定数量的更新数据,digest 方法只能被调用一次。digest 被调用后,messagedigest 对象被重新设置成其初始状态。 实现可随意选择是否实现 cloneable 接口。客户端应用程可以通过尝试复制和捕获 clonenotsupportedexception 测试可复制性:
messagedigest md = messagedigest.getinstance(“sha”);
try {
md.update(tochapter1); messagedigest tc1 = md.clone(); byte[] tochapter1digest = tc1.digest(); md.update(tochapter2); ...etc.
} catch (clonenotsupportedexception cnse) {
throw new digestexception("couldn't make digest of partial content");
}
注意,如果给定的实现是不可复制的,而事先已知摘要的数目,则仍然能够通过实例化几个实例计算中间摘要。
主要方法的作用,在上面代码的注释中已经给出,这里就不在介绍了.
md5的应用领域主要可以分为以下几类:
1、防止被篡改(文件完整性验证),比如我提供文件下载,为了防止不法分子在安装程序中添加木马,我可以在网站上公布由安装文件得到的md5输出结果。
2、防止直接看到明文(口令加密),现在很多网站在数据库存储用户的密码的时候都是存储用户密码的md5值。这样就算不法分子得到数据库的用户密码的md5值,也无法知道用户的密码。
3、防止抵赖(数字签名),例如a写了一个文件,认证机构对此文件用md5算法产生摘要信息并做好记录。这样可以防止出现以后a不承认此事而带来的麻烦。
虽然md5是一种不可逆的算法,但并不意味着不可破解,大多数用户设置密码时都会使用比较有特殊意义的字段,比如生日,名字简拼,等,如果我把你的相关的信息,猜测出你可能会使用的密码,然后把他们都用md5加密一遍,就得到很多个密文,再拿到你的密码的密文和我的密文库里一一对比,如果密文能匹配,那么你的密码本身也就不攻自破了.
该用户其它信息

VIP推荐

免费发布信息,免费发布B2B信息网站平台 - 三六零分类信息网 沪ICP备09012988号-2
企业名录 Product