天天看点

md5base64 是什么,md5 base64使用场景, base64优势,Android 使用md5

MD5 Message-Digest Algorithm  信息消化算法),一种被广泛使用的密码散列函数

md5 base64使用场景:

md5 用户密码存储 文件校验

base64 公开的代码图片文件加密  url加密

MD5:是一种不可逆的摘要算法,用于生成摘要,无法逆破解到原文。常用的是生成32位摘要,用于验证数据的有效性。比如,在网络请求接口中,通过将所有的参数生成摘要,客户端和服务端采用同样的规则生成摘要,这样可以防止篡改。又如,下载文件时,通过生成文件的摘要,用于验证文件是否损坏。校验使用

Base64:属于加密算法,是可逆的,经过encode后,可以将decode得到原文。在开发中,有的公司上传图片(指纹)采用的是将图片转换成Base64字符串,再上传。在做加密相关的功能时,通常会将数据进行Base64加密/解密。

base64优势:

数据传输稳定

我们知道在计算机中任何数据都是按ascii码存储的,而ascii码的128~255之间的值是不可见字符。而在网络上交换数据时,比如说从A地传到B地,往往要经过多个路由设备,由于不同的设备对字符的处理方式有一些不同,这样那些不可见字符就有可能被处理错误,这是不利于传输的。所以就先把数据先做一个Base64编码,统统变成可见字符,这样出错的可能性就大降低了。

对证书来说,特别是根证书,一般都是作Base64编码的,因为它要在网上被许多人下载。电子邮件的附件一般也作Base64编码的,因为一个附件数据往往是有不可见字符的。

那么Base64到底是怎样编码的呢?

简单来说,任何一个数据无非可以看作一个比特流,如01000100010011101100111010111100011001010......那么我们取6个比特为一组,计算它的ascii值,得到一个字符,这个字符肯定是可见字符,好,把它对应的字符写出来,再取6个比特,计算...,如此下去,直到最后,就完成了编码。

1.标准base64只有64个字符(英文大小写、数字和+、/)以及用作后缀等号;

2.base64是把3个字节变成4个可打印字符,所以base64编码后的字符串一定能被4整除(不算用作后缀的等号);

3.等号一定用作后缀,且数目一定是0个、1个或2个。这是因为如果原文长度不能被3整除,base64要在后面添加\0凑齐3n位。为了正确还原,添加了几个\0就加上几个等号。显然添加等号的数目只能是0、1或2;

4.严格来说base64不能算是一种加密,只能说是编码转换。使用base64的初衷。是为了方便把含有不可见字符串的信息用可见字符串表示出来,以便复制粘贴;

MD5值有几个特点:

1、它是一段固定长度的数据,即128bit的由“0”和“1”组成的一段二进制数据。无论原始数据是多长或多短,其MD5值都是128bit。

2、通常(或者叫行业规定),这段128bit的数据,按4bit一组分成32组,每一组按16进制来计算其值,并以字符的形式输出每个值。比如一组数据按16进制计算出来的值是0-9,打印出来也是0-9,如果计算出来的值是a-f,如果直接打印的话将会是10-15,在java中可以使用String.format("%02x", bytes[i])方法来将16进制的 a-f 打印成字母“a-f”,最终这个128bit的数据将会被打印成一个32位的字符串。所以我们通常所说的MD5值就是指这串32位的由“0-9,a-f”所组成的字符串。如果你看到某个MD5不是32位,或发现其中含有“0~f”之外的字符,那肯定是个错误的MD5值。

3、确定性,一个原始数据的MD5值是唯一的,同一个原始数据不可能会计算出多个不同的MD5值。(唯一性)

4、碰撞性,原始数据与其MD5值并不是一一对应的,有可能多个原始数据计算出来的MD5值是一样的,这就是碰撞。(不可逆) 因此可以校验文件是否损坏;

5、不可逆。也就是说如果告诉你一个MD5值,你是无法通过它还原出它的原始数据的,这不是你的技术不够牛,这是由它的算法所决定的。因为根据第4点,一个给定的MD5值是可能对应多个原始数据的,并且理论上讲是可以对应无限多个原始数据,所有无法确定到底是由哪个原始数据产生的。

Base64

实质是 一种编码格式,如同UTF-8

是一种用64个字符来表示任意二进制数据的方法

可逆性。

可以将图片等二进制文件转换为文本文件。

可以把非ASCII字符的数据转换成ASCII字符,避免不可见字符。

MD5

实质是一种散列表的计算方式

不可逆性。

任意长度的明文字符串,加密后得到的密文字符串是长度固定的。

Android 使用md5 ,base64

base64:

String encodedString = Base64.encodeToString("1".getBytes(), Base64.NO_PADDING);
        Log.e("Base64", "Base64---->" + encodedString);

        String decodedString =new String(Base64.decode(encodedString,Base64.DEFAULT));
        Log.e("Base64", "Base64---->"      

MD5:

public String md5Decode32(String content) {
        byte[] hash;
        try {
            hash = MessageDigest.getInstance("MD5").digest(content.getBytes("UTF-8"));
        } catch (NoSuchAlgorithmException e) {
            throw new RuntimeException("NoSuchAlgorithmException",e);
        } catch (UnsupportedEncodingException e) {
            throw new RuntimeException("UnsupportedEncodingException", e);
        }
        //对生成的16字节数组进行补零操作
        StringBuilder hex = new StringBuilder(hash.length * 2);
        for (byte b : hash) {
            if ((b & 0xFF) < 0x10){
                hex.append("0");
            }
            hex.append(Integer.toHexString(b & 0xFF));
        }
        return