MD5加密有哪些特点?
压缩性:任意长度的数据,算出的MD5值长度都是固定的。
容易计算:从原数据计算出MD5值很容易。
抗修改性:对原数据进行任何改动,哪怕只修改1个字节,所得到的MD5值都有很大区别。
强抗碰撞:已知原数据和其MD5值,想找到一个具有相同MD5值的数据(即伪造数据)是非常困难的。
如果计算一个对象的MD5值,那么这个对象我对它做了修改MD5值会发生改变嘛
如果你对对象进行了修改,其 MD5 值通常会发生改变。MD5 是一种不可逆的哈希算法,即使进行小幅修改,也会导致产生不同的 MD5 哈希值。
MD5 算法的特性是对输入的敏感性很高,即使输入发生微小的改变,输出的哈希值也会显著不同。这使得 MD5 常用于验证数据的完整性,因为对原始数据的任何更改都会导致其哈希值不同。
举例来说,如果有一个字符串 "Hello",计算其 MD5 值,然后将字符串修改为 "Hello!",再次计算 MD5 值,两者的 MD5 值会是截然不同的。
MD5会出现类似哈希冲突的问题嘛
在一般情况下,MD5 算法是设计为尽量避免哈希冲突的,即不同的输入应该产生不同的 MD5 哈希值。MD5 算法的输出长度是固定的 128 位,理论上有 2^128 种不同的可能性,因此对于随机选择的输入,出现哈希冲突的概率非常小。
然而,由于 MD5 的设计存在一些漏洞,导致在特殊情况下发生碰撞变得更为容易。攻击者可以利用这些漏洞,通过巧妙选择输入,生成相同的 MD5 哈希值。这使得 MD5 不再适合用于安全性要求较高的场景,如密码哈希或数字签名。
因此,尽管在一般情况下 MD5 可能不会立即出现哈希冲突,但由于已知的漏洞,不再推荐将 MD5 用于安全性要求高的场合。更安全的选择包括使用 SHA-256 或 SHA-3 等更强大的哈希算法。
MD5的使用
计算String的MD5值
private void a(String repo) {
try {
MessageDigest md5 = MessageDigest.getInstance("MD5");
byte[] bytes = md5.digest(repo.getBytes());
String result = "";
for (byte b : bytes) {
String temp = Integer.toHexString(b & 0xff);
if (temp.length() == 1) {
temp = "0" + temp;
}
result += temp;
}
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
}
计算文件的MD5值
public static String md5(File file) {
if (file == null || !file.isFile() || !file.exists()) {
return "";
}
FileInputStream in = null;
String result = "";
byte buffer[] = new byte[8192];
int len;
try {
MessageDigest md5 = MessageDigest.getInstance("MD5");
in = new FileInputStream(file);
while ((len = in.read(buffer)) != -1) {
md5.update(buffer, 0, len);
}
byte[] bytes = md5.digest();
for (byte b : bytes) {
String temp = Integer.toHexString(b & 0xff);
if (temp.length() == 1) {
temp = "0" + temp;
}
result += temp;
}
} catch (Exception e) {
e.printStackTrace();
}finally {
if(null!=in){
try {
in.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
return result;
}