(转)聊一聊MD5

MD5是什么

message-digest algorithm 5(信息-摘要算法)。经常说的“MD5加密”,就是它→信息-摘要算法。

在下载一下东西时,经常在一些压缩包属性里,看到md5值。而且这个下载页面,很可能会在某一个地方,写了一句,此文件的MD5值为XXXXXXXXX。这有什么作用呢?

白话白话:md5,其实就是一中算法。可以将一个字符串,或文件,或压缩包,执行md5后,就可以生成一个固定长度为128bit的串。这个串,基本上是唯一的。

所以,有人修过压缩包后,就会生成新的串,这时就可以拿网站提供的串和新生成的串对比,如果不同,那就是被人修过过了。

加密和摘要,是不一样的

加密后的消息是完整的;具有解密算法,得到原始数据;

摘要得到的消息是不完整的;通过摘要的数据,不能得到原始数据;

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的值

public class MD5Test {

    //main测试类
    public static void main(String[] args) {
        String result = getMD5("aaa");
        System.err.println(result);
    }

    /**
     * 生成md5
     * @param message
     * @return
     */
    public static String getMD5(String message) {
        String md5str = "";
        try {
            //1 创建一个提供信息摘要算法的对象,初始化为md5算法对象
            MessageDigest md = MessageDigest.getInstance("MD5");

            //2 将消息变成byte数组
            byte[] input = message.getBytes();

            //3 计算后获得字节数组,这就是那128位了
            byte[] buff = md.digest(input);

            //4 把数组每一字节(一个字节占八位)换成16进制连成md5字符串
            md5str = bytesToHex(buff);

        } catch (Exception e) {
            e.printStackTrace();
        }
        return md5str;
    }

    /**
     * 二进制转十六进制
     * @param bytes
     * @return
     */
    public static String bytesToHex(byte[] bytes) {
        StringBuffer md5str = new StringBuffer();
        //把数组每一字节换成16进制连成md5字符串
        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的详细算法……自己搜吧。

另外,二进制转16进制字符串:

public String byte2hex(byte[] b) {
        StringBuffer buf = new StringBuffer("");
        String stmp = "";
         for (int offset = 0; offset < b.length; offset++) {
                stmp = Integer.toHexString(b[offset]&0XFF);
                if(stmp.length() == 1)
                   buf.append("0").append(stmp);
                else
                   buf.append(stmp);
         }
         return buf.toString();
    }                       
时间: 2024-10-18 09:42:27

(转)聊一聊MD5的相关文章

聊一聊MD5

MD5是什么 message-digest algorithm 5(信息-摘要算法).经常说的"MD5加密",就是它→信息-摘要算法. 在下载一下东西时,经常在一些压缩包属性里,看到md5值.而且这个下载页面,很可能会在某一个地方,写了一句,此文件的MD5值为XXXXXXXXX.这有什么作用呢? 白话白话:md5,其实就是一中算法.可以将一个字符串,或文件,或压缩包,执行md5后,就可以生成一个固定长度为128bit的串.这个串,基本上是唯一的. 所以,有人修过压缩包后,就会生成新的串

加密策略

一.前言 这两天研究了一下项目中的密码加密,可以说得上是学到了很多.下面来大致说一下. 二.常用加密 1.单向加密算法 单向加密算法主要用来验证数据传输的过程中,是否被篡改过. BASE64 严格地说,属于编码格式,而非加密算法 MD5(Message Digest algorithm 5,信息摘要算法) SHA(Secure Hash Algorithm,安全散列算法) HMAC(Hash Message Authentication Code,散列消息鉴别码 2.对称和非对称加密算法 对称和

Java中的各种加密算法

JAVA中为我们提供了丰富的加密技术,可以基本的分为单向加密和非对称加密 1.单向加密算法 单向加密算法主要用来验证数据传输的过程中,是否被篡改过. BASE64 严格地说,属于编码格式,而非加密算法 MD5(Message Digest algorithm 5,信息摘要算法) SHA(Secure Hash Algorithm,安全散列算法) HMAC(Hash Message Authentication Code,散列消息鉴别码 2.对称和非对称加密算法 对称和非对称加密算法主要采用公钥和

&#65279;&#65279;iPhone6plus 的 iOS 11 GM和正式版安装包的 md5一模一样

同上:chens-MacBook-Air:~ chen$ md5 /Users/chen/Downloads/iPhone_5.5_11.0_15A372_Restore.ipsw MD5 (/Users/chen/Downloads/iPhone_5.5_11.0_15A372_Restore.ipsw) = 0473f217af0f20e138649385de6db6c7GM 版本的 md5 chens-MacBook-Air:~ chen$ md5 /Users/chen/Download

C# MD5

private static string GetMd5String(string msg) { StringBuilder sb = new StringBuilder(); using(MD5 md5 = MD5.Create()) { byte[] bytes = Encoding.UTF8.GetBytes(msg); byte[] md5Byte = md5.ComputeHash(bytes); for (int i = 0; i < md5Byte.Length; i++) { s

MD5加密和RSA加密

1.MD5加密  MD5(单向散列算法)的全称是Message-Digest Algorithm 5(信息-摘要算法),MD5算法的使用不需要支付任何版权费用. MD5的功能:     ①.输入任意长度的信息,经过处理,输出为128位的信息(数字指纹):    ②.不同的输入得到的不同的结果(唯一性):    ③.根据128位的输出结果不可能反推出输入的信息(不可逆),也就是只能加密,不能解密:  MD5的用途:     1.防止被篡改:    1)比如发送一个电子文档,发送前,我先得到MD5的

字符串以及文件的hashlib的md5和sha1等的运用

hashlib的md5和sha1等的运用 import hashlib print(hashlib.algorithms_available) print(hashlib.algorithms_guaranteed) #MD5 import hashlib hash_object = hashlib.md5(b'Hello World') print(hash_object.hexdigest()) # import hashlib mystring = input('Enter String

阿里云oss Multipart Upload 中每个part的E-tag(即MD5)求法

阿里云java的开发文档中提到:OSS 会将服务器端收到 Part 数据的 MD5 值放在 ETag 头内返回给用户. 为了保证数据在网络传输过程中不出现错误,强烈推荐用户在收到 OSS 的返回请求后,用该 MD5 值验证上传数据的正确性. 但是没有告诉怎么验证,纠结了一天之后终于找到了在本地求每个part的MD5值得方法: <span style="font-size:18px;">private static HashMap<Integer, String>

&nbsp; &nbsp; MD5,MySQL,SHA解密 - 利用GPU进行密码破解

使用方法: 1 打开命令行cmd 然后切换到egb的目录,假设你的文件夹在f盘,则输入:  f:2. 在当前目录输入: egb.exe /info查看你的电脑是否支持使用CUDA3. 可以将要破解的文件放置到当前目录4. 回到命令窗口,输入: egb.exe MD5 Settings/MD5.ini password.txt5. 上面的MD5表示使用MD5解密方式,而Settings/MD5.ini则是具体的配置文件.程序内置了72中不同类型的解密配置文件,可以自己浏览一下. 而passwd.t