Base64

一:算法由来

Base64最早应用于解决电子邮件传输的问题。在早期,由于“历史问题”,电子邮件只允许ASCII码字符。如果要传输一封带有非ASCII码字符的电子邮件(例如附件),当它通过有“历史问题”的网关时就可能出现问题(网关可能会对非ASCII码字符的二进制位作调整,即将非ASCII码的8位二进制码最高位置为0)。此时用户收到的邮件会是一封纯粹的乱码邮件,由于这个原因产生了base64算法。Base64是一种编码方式,而不是一种加密方式

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

  • 标准Base64只有64个字符(英文大小写、数字和+、/)以及用作后缀等号
  • base64是把3个字节变成4个可打印字符,所以base64编码后的字符串一定能被4整除(不算用作后缀的等号)
  • 等号一定用作后缀,且数目一定是0个、1个或2个。这是因为如果原文长度不能被3整除,base64要在后面添加\0凑齐3n位。为了正确还原,添加了几个\0就加上几个等号。显然添加等号的数目只能是0、1或2;

Base64是一种任意二进制到文本字符串的编码方法(二进制=》ASCII),Base64适用于小段内容的编码,常用于在URL、Cookie、网页中传输少量二进制数据、数字证书签名、密钥。

“123456”对应的二进制位 00110001 00110010 00110011 00110100 00110101 00110110, 我们取6个比特为一组结果为

  • 001100
  • 010011
  • 001000
  • 110011
  • 001101
  • 000011
  • 010100
  • 110110

对应的base64为:MTIzNDU2

由于标准的Base64编码后可能出现字符+和/,在URL中就不能直接作为参数,所以又有一种”url safe”的base64编码,其实就是把字符+和/分别变成-和_:
由于=字符也可能出现在Base64编码中,但=用在URL、Cookie里面会造成歧义,所以,很多Base64编码后会把=去掉或者替换成.

二:Base64Util

public class Base64Util {

    public static String encode(String src){
        BASE64Encoder encoder = new BASE64Encoder();
        String encode = encoder.encode(src.getBytes());

        return encode;
    }

    public static String decode(String encode) throws Exception {
        BASE64Decoder decoder = new BASE64Decoder();
        byte[] bytes = decoder.decodeBuffer(encode);
        return new String(bytes);
    }

    /**
     * 将base64种的敏感字符+,/,=转化为_,-,. 以及base64会在编码串中产生换行符
     * @param source
     * @return
     */
    public static String urlSafeEncode(byte[] source) {
        BASE64Encoder encoder = new BASE64Encoder();
        String str = encoder.encode(source);

        str = str.replaceAll("\\+", "_");
        str = str.replaceAll("/", "-");
        str = str.replaceAll("=", ".");
        str = str.replaceAll("\\s", "");

        return str;
    }

    /**
     * urlSafeEncode逆过程
     * @param str
     * @return
     * @throws IOException
     */
    public static byte[] urlSafeDecode(String str) throws IOException {
        if (str == null) {
            return null;
        }

        str = str.replaceAll("_", "+");
        str = str.replaceAll("-", "/");
        str = str.replaceAll("\\.", "=");

        BASE64Decoder decoder = new BASE64Decoder();
        byte[] bytes = decoder.decodeBuffer(str);

        return bytes;
    }

    public static void main(String[] args) throws Exception{
        String encode = Base64Util.encode("123456");
        String decode = Base64Util.decode(encode);
        System.out.println(encode);
        System.out.println(decode);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

风流 少年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值