md5加密原理
程序员文章站
2024-03-19 09:42:28
...
md5加密原理
首先要明白一个概念,md5不是用于加密,而是用于数据的完整性校验的一种技术。
这是一个单向散列函数,单向的意思就是说不可逆转。你可以将源内容通过md5函数散列出一个md5校验码,这个md5校验码是唯一的,你可以作为证明源的身份标识,但是你无法通过md5校验码去还原源。
Src ---> md5 --->md5Code
但是 md5Code --->某算法 ---> Src 是不可能的
同样的内容经过md5算法总是得到相同的md5校验码。
之所以给人以md5是用于加密的这种假象,是因为该技术应用于很多密码校验和文件完整性校验过程中。
如你的password用明文输入,经过md5以后形成一个32字节的 md5校验码,保存在服务器上。服务器的管理员可以看到你的32字节的md5校验码,但是因为没有办法通过md5校验码还原成原密码,因此该密码的保存(实际上是保存的密码的一个唯一标识)是安全的。
校验的时候,你输入你的密码,经过md5以后形成一个新的32字节的md5校验码,服务器比较新的校验码和旧的校验码就可以判断你是否输入了正确的密码。在整个认证和鉴权的过程中,服务器只和你的密码生成以后的md5校验码打交道,而避免了和密码直接打交道。
其次用得非常多的是文件的完整性校验。
我们都经常从FTP站点上下载文件,在Internet不可信任的环境中,存在很多的不安全因素。如果你下载的session被人截获,并在下载的文件中插入危险代码,使得当你下载完毕运行程序的时候植入木马或者病毒或者其他非安全的代码。要验证文件的完整性,FTP server一般将整个文件夹打成包,如iso文件,然后同时给出md5校验码。当你下在该iso文件,在刻盘之前,运行md5程序产生一个md5校验码,如果和FTP Server上的校验码一样,就可以证明:在文件传输的过程中没有产生错误和任何修改。如果你信赖该FTP Server,那么你就可以放心使用该文件或资源。
样例:
首先要明白一个概念,md5不是用于加密,而是用于数据的完整性校验的一种技术。
这是一个单向散列函数,单向的意思就是说不可逆转。你可以将源内容通过md5函数散列出一个md5校验码,这个md5校验码是唯一的,你可以作为证明源的身份标识,但是你无法通过md5校验码去还原源。
Src ---> md5 --->md5Code
但是 md5Code --->某算法 ---> Src 是不可能的
同样的内容经过md5算法总是得到相同的md5校验码。
之所以给人以md5是用于加密的这种假象,是因为该技术应用于很多密码校验和文件完整性校验过程中。
如你的password用明文输入,经过md5以后形成一个32字节的 md5校验码,保存在服务器上。服务器的管理员可以看到你的32字节的md5校验码,但是因为没有办法通过md5校验码还原成原密码,因此该密码的保存(实际上是保存的密码的一个唯一标识)是安全的。
校验的时候,你输入你的密码,经过md5以后形成一个新的32字节的md5校验码,服务器比较新的校验码和旧的校验码就可以判断你是否输入了正确的密码。在整个认证和鉴权的过程中,服务器只和你的密码生成以后的md5校验码打交道,而避免了和密码直接打交道。
其次用得非常多的是文件的完整性校验。
我们都经常从FTP站点上下载文件,在Internet不可信任的环境中,存在很多的不安全因素。如果你下载的session被人截获,并在下载的文件中插入危险代码,使得当你下载完毕运行程序的时候植入木马或者病毒或者其他非安全的代码。要验证文件的完整性,FTP server一般将整个文件夹打成包,如iso文件,然后同时给出md5校验码。当你下在该iso文件,在刻盘之前,运行md5程序产生一个md5校验码,如果和FTP Server上的校验码一样,就可以证明:在文件传输的过程中没有产生错误和任何修改。如果你信赖该FTP Server,那么你就可以放心使用该文件或资源。
样例:
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
public class md5 {
public String str;
public void md5s(String plainText) {
try {
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(plainText.getBytes());
byte b[] = md.digest();
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));
}
str = buf.toString();
System.out.println("result: " + buf.toString());// 32位的加密
System.out.println("result: " + buf.toString().substring(8, 24));// 16位的加密
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public static void main(String agrs[]) {
md5 md51 = new md5();
md51.md5s("4");//加密4
}
}
上一篇: Road Optimization
下一篇: 生活记录贴