MD5属不属于加密算法,因为只可以加密,无法获得密码原文,只能属于算法。
常见的加密算法
常用加密算法可以分为单向加密和双向加密。
- 单向加密:只提供单向加密不能解密,不可逆的过程。通常用来存储用户名和密码,直接从前端传输来存储到数据库中
- 双向加密:又分为对称性加密算法和非对称性加密算法。对称性加密算法,发送和接收端双方都知道秘钥和加密算法且秘钥都是相同的,之后便是对数据的加密和解密过程。非对称加密算法 :发送之前A B事先生成一对秘钥,A将秘钥发送给B,B将秘钥发送给 A,A先用B的秘钥加密密文在发送B,B解密,同理。
1.什么是MD5加密(单向加密)
MD5信息摘要算法 (英语:MD5 Message-Digest Algorithm),一种被广泛使用的 密码散列函数 ,可以产生出一个128位(16 字节 )的散列值(hash value),用于确保信息传输完整一致。MD5由美国密码学家 罗纳德·李维斯特 (Ronald Linn Rivest)设计,于1992年公开,用以取代 MD4 算法。这套算法的程序在 RFC 1321 标准中被加以规范。1996年后该算法被证实存在弱点,可以被加以破解,对于需要高度安全性的数据,专家一般建议改用其他算法,如 SHA-2 。2004年,证实MD5算法无法防止碰撞(collision),因此不适用于安全性认证,如 SSL 公开密钥认证或是 数字签名 等用途。
2.MD5加密的功能
输入任意长度的信息,经过处理,输出都是128位的信息值
不同的输入对应的输出一定不同,保证唯一性
3.MD5加密的优点和缺点
优点:
- 防止被篡改,在传输过程中一旦被串改,那么计算出的MD5值一定不同。
- 计算速度快。加密速度快,不需要秘钥。
- 检查文件的完整性,一旦文件被更改,MD5值也是不同的。
- 防止看到明文,公司存放密码存放的是MD5值。
- 防止抵赖,用于数字签名,一旦用户的文件被第三方MD5加密,若以后A说这个文件不是他写的,那么当用文件MD5后获得的签名一致,可以确认。
缺点:
- 作为一种散列算法,虽然很难发生散列碰撞,但是经过证实,仍然存在两种不同数据会发生碰撞。
- MD5的安全性:将用户的密码直接MD5后存储在数据库是不安全的。第一,用户普遍习惯用容易记忆的密码,生日,手机号等,黑客容易破译此类密码。这也是加盐值的一个原因。第二,直接MD5存入数据库,若数据库被破解,通过MD5反查会查到密码,需要随机盐值的配合。
- 考虑到多数人所使用的密码为常见的组合,攻击者可以将所有密码的常见组合进行单向哈希,得到一个摘要组合,然后与数据库中的摘要进行比对即可获得对应的密码。这个摘要组合也被称为rainbow table。
4.MD5的实现原理:
- 填充:将输入信息进行512求余分组,若不等于448,那么进行填充 1 和0,一个1 N个0。最后的数据就为N*512+448
- 记录信息长度:将得到的信息用64位存储填充之前的信息长度,这样448+64=512,总信息为N+1个512
- 以四个常数ABCD与每组512位进行函数运算,最后输出的结果就是4组32位的常数。拼接得到MD5码
5.MD5加密 代码实现:
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
/**
* MD5加密
*/
public class MD5Utils {
public static String code(String str){
try {
MessageDigest messageDigest = MessageDigest.getInstance("MD5"); messageDigest.update(str.getBytes());
byte[]byteDigest = messageDigest.digest();
int i;
StringBuffer buffer = new StringBuffer("");
for (int offset = 0; offset<byteDigest.length;offset++){
i = byteDigest[offset];
if(i<0){
i+=256;
}
if(i<16){
buffer.append("0");
}
buffer.append(Integer.toHexString(i));
}
//32位加密
return buffer.toString();
//16位加密
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
return null;
}
}
}