MD5的使用

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;
    }

你可能感兴趣的:(java,前端,linux)