当前位置:   article > 正文

Base64编码 和 MD5_base64编码不进行padding

base64编码不进行padding

一、Base64

定义:
Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法。(再加上作为垫字的"=",实际上是65个字符)

编码规则:

  1. 把3个字节变成4个字节
  2. 每76个字符加一个换行符(默认的编码方式)
  3. 最后的结束符也要处理

转换表:
转自 https://baike.baidu.com/item/base64/8545775?fr=aladdin

在这里插入图片描述

编码方式和解码方式:

默认的编码方式 Base64.DEFAULT:当字符串超过76时会自动在中间加一个换行符,字符串最后也会加一个换行符

Base64.CRLF:Win风格的换行符,意思就是使用CR LF这一对作为一行的结尾而不是Unix风格的LF

Base64.NO_PADDING:这个参数是略去编码字符串最后的“=”

Base64.NO_WRAP:这个参数意思是略去所有的换行符(设置后CRLF就没用了)

Base64.NO_WRAP:这个参数意思是编码时不使用对URL和文件名有特殊意义的字符来作为编码字符,具体就是以-和_取代+和/

文本大小:
因为,Base64将三个字节转化成四个字节,因此Base64编码后的文本,会比原文本大出三分之一左右。

二、解码和转码

一般Android不会使用默认的Base64编码方式,这样会让IOS和Android不统一,而是使用 Base64.NO_WRAP


    /**
     * encodeBase64File:(将文件转成base64 字符串).
     *
     * @param path 文件路径
     * @return
     * @throws Exception
     */

    public static String encodeBase64File(String path) throws Exception {
        File file = new File(path);
        FileInputStream inputFile = new FileInputStream(file);
        byte[] buffer = new byte[(int) file.length()];
        inputFile.read(buffer);
        inputFile.close();
        return Base64.encodeToString(buffer, Base64.NO_WRAP);
    }

    /**
     * decoderBase64File:(将base64字符解码保存文件).
     *
     * @param base64Code 编码后的字串
     * @param savePath   文件保存路径
     * @throws Exception
     */
    public static void decoderBase64File(String base64Code, String savePath) throws Exception {
        byte[] buffer = Base64.decode(base64Code, Base64.NO_WRAP);
        FileOutputStream out = new FileOutputStream(savePath);
        out.write(buffer);
        out.close();
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

三、MD5

MD5 (Message Digest Algorithm 5) 是一种常见的加密算法,用于将任意长度的数据计算出一个固定长度的摘要(或称为哈希值、消息摘要、指纹),通常为 128 位(16 字节)。

MD5 算法的原理是将数据分为若干个块,每个块的大小为 512 位(64 字节),对每个块进行计算,最后将每个块的计算结果合并起来得到最终的 MD5 值。计算过程中涉及到一些位运算、逻辑运算和循环移位操作,使得即使输入数据仅发生微小的改动,最终的 MD5 值也会发生很大的变化。

MD5 算法的应用非常广泛,例如在密码存储、数字签名、消息认证等方面都有应用。但是,由于 MD5 算法存在一些安全性问题,如碰撞攻击,因此在一些场合下已经被更安全的哈希算法所替代,如 SHA-256、SHA-3 等。

四、MD5 方法

    public static String md5(String s) {
        char[] hexDigits = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'a', 'b', 'c', 'd', 'e', 'f'};
        try {
            byte[] btInput = s.getBytes();
            // 获得MD5摘要算法的 MessageDigest 对象

             如果输入“SHA”,就是实现SHA加密
            MessageDigest mdInst = MessageDigest.getInstance("MD5");
            // 使用指定的字节更新摘要
            mdInst.update(btInput);
            // 获得密文
            byte[] md = mdInst.digest();
            // 把密文转换成十六进制的字符串形式
            int j = md.length;
            char str[] = new char[j * 2];
            int k = 0;
            for (int i = 0; i < j; i++) {
                byte byte0 = md[i];
                str[k++] = hexDigits[byte0 >>> 4 & 0xf];
                str[k++] = hexDigits[byte0 & 0xf];
            }
            return new String(str);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

五、三方库

三方封装工具类

https://github.com/Blankj/AndroidUtilCode/blob/51c8124045ec5b7c6d342b94a4020ed2f7fda496/lib/utilcode/README-CN.md

注意:其中的 MD5 加密后,未转成 16 进制,需要自己转


    fun loginDfsk(phone: String, password: String) {
        request(
            {
                dfskService.login(
                    ReqLogin(
                        phone,
                        EncodeUtils.base64Encode2String(
                            bytesToHexString(
                                EncryptUtils.encryptMD5(password.toByteArray())
                            ).toByteArray()
                        )
                    )
                )
            },
            loginResultDfsk,
            true,
            "登录中..."
        )
    }

    fun bytesToHexString(var0: ByteArray): String {
        val var1 = StringBuilder()
        for (var2 in var0.indices) {
            val var3 = Integer.toHexString(255 and var0[var2].toInt())
            if (var3.length == 1) {
                var1.append('0')
            }
            var1.append(var3)
        }
        return var1.toString()
    }

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33

参考地址

百度 base64:https://baike.baidu.com/item/base64/8545775?fr=aladdin

编码之Base64编码:https://www.shuzhiduo.com/A/lk5aPNnoJ1/

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号