转载文章:http://www.weixuehao.com/archives/474#comments
MD5是什么
message-digest algorithm 5(信息-摘要算法)。经常说的“MD5加密”,就是它→信息-摘要算法。
在下载一下东西时,经常在一些压缩包属性里,看到md5值。而且这个下载页面,很可能会在某一个地方,写了一句,此文件的MD5值为XXXXXXXXX。这有什么作用呢?
白话白话:md5,其实就是一中算法。可以将一个字符串,或文件,或压缩包,执行md5后,就可以生成一个固定长度为128bit的串。这个串,基本上是唯一的。
所以,有人修过压缩包后,就会生成新的串,这时就可以拿网站提供的串和新生成的串对比,如果不同,那就是被人修过过了。
加密和摘要,是不一样的
加密后的消息是完整的;具有解密算法,得到原始数据;
摘要得到的消息是不完整的;通过摘要的数据,不能得到原始数据;
所以,当看到很多人说,md5,加密,解密的时候,呵呵一笑就好了。
MD5长度
有人说md5,128位,32位,16位,到底md5多长?
md5的长度,默认为128bit,也就是128个0和1的二进制串。
这样表达是很不友好的。
所以将二进制转成了16进制,每4个bit表示一个16进制,
所以128/4 = 32 换成16进制表示后,为32位了。
为什么网上还有md5是16位的呢?
网上有很多帖子,md5 32位 16位 加密 区别。
仔细观察admin生成的32位和16位的md5值……
查询结果:
md5(admin,32) = 21232f297a57a5a743894a0e4a801fc3
md5(admin,16) = 7a57a5a743894a0e
看出来了吧!
其实16位的长度,是从32位md5值来的。是将32位md5去掉前八位,去掉后八位得到的。
MD5的作用
①一致性检验,最上面那个例子
②数字签名,还是最上面那个例子。只是把md5看出了一个指纹,按了个手印说明独一无二了。
③安全访问认证,这个就是平时系统设计的问题了。
在用户注册时,会将密码进行md5加密,存到数据库中。这样可以防止那些可以看到数据库数据的人,恶意操作了。
md5不能破解吗?
md5是不可逆的,也就是没有对应的算法,从生产的md5值逆向得到原始数据。
但是如果使用暴力破解,那就另说了。
md5是唯一的吗?
md5作为数据库中的主键可行吗?这就涉及到一个问题,md5值是唯一的吗?答案是,不唯一。
也就是一个原始数据,只对应一个md5值;
但是一个md5值,可能对应多个原始数据。
java中生成MD5的值
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
|
public
class
MD5Test {
public
static
void main(String[] args) {
String
result = getMD5( "aaa" );
System.err.println(result);
}
public
static
String getMD5(String message) {
String
md5str = "" ;
try
{
MessageDigest
md = MessageDigest.getInstance( "MD5" );
byte[]
input = message.getBytes();
byte[]
buff = md.digest(input);
md5str
= bytesToHex(buff);
}
catch
(Exception e) {
e.printStackTrace();
}
return
md5str;
}
public
static
String bytesToHex(byte[] bytes) {
StringBuffer
md5str = new
StringBuffer();
int
digital;
for
(int i = 0; i < bytes.length; i++) {
digital
= bytes[i];
if (digital
< 0) {
digital
+= 256;
}
if (digital
< 16){
md5str.append( "0" );
}
md5str.append(Integer.toHexString(digital));
}
return
md5str.toString().toUpperCase();
}
}
|
MD5的详细算法……自己搜吧。
分享到:
相关推荐
MD5算法的目的是创建一个独特的“指纹”,如果文件内容稍有改动,其MD5摘要就会完全不同,因此可以用来检测文件是否被修改。 SHA1(Secure Hash Algorithm 1)是另一种哈希函数,它生成的是160位(20字节)的摘要,...
4. **结果合并**:经过所有块的处理后,四个初始化变量会逐步更新,最终得到的就是128位的哈希值,也就是我们常说的MD5摘要。 在Android开发中,MD5常用于文件校验、用户密码存储和数据传输的完整性验证。例如,当...
用MD5消息摘要再用RSA进行签名~用MD5消息摘要再用RSA进行签名~用MD5消息摘要再用RSA进行签名~
MD5 摘要算法的C语言实现,从 RFC1321 中摘出来的算法实现
在大端字节序系统上生成的MD5摘要可以直接与小端字节序系统的摘要比较,但如果在两个系统间传输摘要,需要进行字节顺序的转换。 8. **最后的位运算**:经过四轮迭代后,将四个中间变量进行最后的位运算,然后组合成...
在VC++环境中,开发人员通常需要计算文件的MD5摘要来验证文件的完整性和未被篡改。MD5算法生成一个128位的散列值,通常以32个十六进制数字的形式表示,这使得即使是微小的数据变化也会导致生成的MD5摘要显著不同。 ...
用户可以通过这些库轻松地对字符串、文件等进行MD5加密,得到的MD5摘要通常是一个32位的十六进制字符串,例如"MD5摘要加密"这个字符串的MD5值可能是"e10adc3949ba59abbe56e057f20f883e"。 总结来说,MD5摘要加密是...
在提供的"MessageSecurity"文件中,可能包含了一个具有图形用户界面(GUI)的Java应用程序,该程序允许用户输入文本并显示其MD5摘要值。这可能是为了教学目的,让用户直观地理解MD5加密的过程。这样的界面通常会包含...
这个项目可能涵盖了从读取文件内容到计算MD5摘要的完整过程,以及如何比较两个MD5摘要以判断文件或数据是否一致。你可以解压文件,运行其中的代码,以加深对MD5在Java中应用的理解。同时,也可以参考该项目的代码...
5. 结果整合:经过所有块的处理后,将四个工作寄存器的内容合并成一个128位的MD5摘要。 将MD5算法封装到DLL文件中,需要提供对外的接口,供其他程序调用。常见的接口可能包括以下几种: - 初始化函数:创建MD5上...
当你下载一个文件后,可以计算其MD5摘要,然后与发布者提供的MD5值进行对比。如果两者匹配,说明文件在传输过程中没有损坏或被篡改。这也是为什么MD5常用于软件下载、镜像文件校验等场景。 然而,MD5的弱点在于它...
`testMd5`可能是用以测试MD5实现的示例程序,它可能包含一段代码,读取一个文件内容,然后计算并打印出该文件的MD5摘要,以此验证算法的正确性。 使用MD5时,需要注意的是,由于MD5算法的安全性问题,它已经不再...
为了创建一个完整的MD5类或函数,你需要提供一个接口,允许用户传递任意长度的字节流,并返回计算出的MD5摘要。这个接口可能包括`Update`方法用于添加数据,`Finalize`方法用于完成计算并返回摘要,以及可能的`Reset...
例如,一个API可能包含`MD5_Init()`、`MD5_Update()`(用于添加更多数据)、`MD5_Final()`(生成最终摘要)和`MD5_End()`(释放资源)等函数。 需要注意的是,尽管MD5在过去的很多年里被广泛应用,但由于其已知的...
论文:MD5摘要实现 来自.中国科学技术大学
这个C++ MD5摘要工程是为了帮助开发者在他们的项目中集成MD5哈希计算功能,使得能够对数据进行快速而安全的校验。 **MD5的工作原理** MD5算法通过一系列复杂的数学运算(包括位操作、异或、加法等)将任意长度的...
MD5(Message-Digest Algorithm 5)是一种广泛使用的哈希函数,它能够将任意长度的输入数据转换成固定长度的128位(16字节)摘要值。这个摘要值具有不可逆性,即无法从摘要恢复原始数据,因此常用于数据完整性校验和...
2004年,Mihir Bellare和王小云分别独立地发现了MD5的碰撞攻击,这意味着两个不同的输入数据可以生成相同的MD5摘要,这严重破坏了MD5的唯一性。因此,MD5在数字签名和密码存储等方面已被更安全的算法如SHA-256取代。...
因此,我们通常不会说"MD5解密",而是说"MD5碰撞",即寻找两个不同的输入数据,它们的MD5摘要相同,但这在实际应用中是非常困难的,尤其是在大量数据下。 MD5的工作原理是通过一系列复杂的数学运算(包括位移、异或...
4. **结果整合**:在所有块处理完成后,A、B、C、D的状态会被转换成16个十六进制数字,这就是最终的MD5摘要。 在C++中,可以使用`unsigned char`数组来存储输入数据,并使用`unsigned int`或`uint32_t`来表示A、B、...