base64

记一个 Base64 有关的 Bug

♀尐吖头ヾ 提交于 2020-03-01 19:06:31
本文原计划写两部分内容,第一是记录最近遇到的与 Base64 有关的 Bug,第二是 Base64 编码的原理详解。结果写了一半发现,诶?不复杂的一个事儿怎么也要讲这么长?不利于阅读和理解啊(其实是今天有点懒想去休闲娱乐会儿),所以 Base64 编码的原理详解的部分将在下一篇带来,敬请关注。 0x01 遇到的现象 A 向 B 提供了一个接口,约定接口参数 Base64 编码后传递。 但 A 对 B 传递的参数进行 Base64 解码时报错了: Illegal base64 character a 0x02 原因分析 搜索后发现这是一个好多网友们都踩过的坑,简而言之就一句话:Base64 编/解码器有不同实现,有的不相互兼容。 比如我上面遇到的现象,可以使用下面这段代码完整模拟复现: package org.mazhuang.base64test; import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.util.Base64Utils;

Decoding Base64 in C# sometimes gives incorrect result with one extra padding character

霸气de小男生 提交于 2020-02-29 23:26:01
问题 I stumbled upon a strange behavior of Convert.FromBase64String in .NET 4.7.2. Normally it would throw an exception when the padding is not correct. But I found a case where adding another padding character produces an incorrect result instead of an exception. var correct = Convert.FromBase64String("YWE="); In this case correct is [97, 97] or "aa" in a string form. But when I add another = : var incorrect = Convert.FromBase64String("YWE=="); instead of getting an exception I get one byte less

Decoding Base64 in C# sometimes gives incorrect result with one extra padding character

允我心安 提交于 2020-02-29 23:24:50
问题 I stumbled upon a strange behavior of Convert.FromBase64String in .NET 4.7.2. Normally it would throw an exception when the padding is not correct. But I found a case where adding another padding character produces an incorrect result instead of an exception. var correct = Convert.FromBase64String("YWE="); In this case correct is [97, 97] or "aa" in a string form. But when I add another = : var incorrect = Convert.FromBase64String("YWE=="); instead of getting an exception I get one byte less

Decoding Base64 in C# sometimes gives incorrect result with one extra padding character

筅森魡賤 提交于 2020-02-29 23:23:51
问题 I stumbled upon a strange behavior of Convert.FromBase64String in .NET 4.7.2. Normally it would throw an exception when the padding is not correct. But I found a case where adding another padding character produces an incorrect result instead of an exception. var correct = Convert.FromBase64String("YWE="); In this case correct is [97, 97] or "aa" in a string form. But when I add another = : var incorrect = Convert.FromBase64String("YWE=="); instead of getting an exception I get one byte less

PHP与base64

与世无争的帅哥 提交于 2020-02-29 20:37:32
1.形如:"data:image/jpeg;base64,/9j/4QAYRXhpZgAASUkqAAgAAAAAAAAAAAAAAP/sABFEdWNreQABAAQAAAA......==" 的字符串就是base64。 2.data:image/jpeg;base64,为头部信息,其余为图片编码。 3.使用base64_decode对编码内容进行解码。 4. 编码后的数据比原始数据略长,为原来的4/3。因为:三个字节有24个位元,就可以刚好对应于4个Base64单元,即3个字节需要用4个Base64的可打印字符来表示。 示例---->将前台传来的被转为base64的字符串转化为图片并存储: function base64($filestr,$filepath,$MaxSize = 300,$filetype = 'jpeg') {    //判断上传文件的大小   $filesize = round(strlen($filestr)/1024/4*3,1);   if($filesize > $MaxSize) return '传入图片过大';   //将base64字符串中的 '/','+'替换成为 '_','-' ,因为PHP中base64的编码只有0-9,a-z,A-Z,'-','_'64种。   $img = str_replace(array('_','-'),

加密算法(DES,AES,RSA,MD5,SHA1,Base64)比较

末鹿安然 提交于 2020-02-29 17:15:20
转载自:http://www.cnblogs.com/sochishun/p/7028056.html 加密算法(DES,AES,RSA,MD5,SHA1,Base64)比较和项目应用 加密技术通常分为两大类:"对称式"和"非对称式"。 对称性加密算法: 对称式加密就是加密和解密使用同一个密钥。信息接收双方都需事先知道密匙和加解密算法且其密匙是相同的,之后便是对数据进行加解密了。对称加密算法用来对敏感数据等信息进行加密。 非对称算法: 非对称式加密就是加密和解密所使用的不是同一个密钥,通常有两个密钥,称为"公钥"和"私钥",它们两个必需配对使用,否则不能打开加密文件。发送双方A,B事先均生成一堆密匙,然后A将自己的公有密匙发送给B,B将自己的公有密匙发送给A,如果A要给B发送消 息,则先需要用B的公有密匙进行消息加密,然后发送给B端,此时B端再用自己的私有密匙进行消息解密,B向A发送消息时为同样的道理。 散列算法: 散列算法,又称哈希函数,是一种单向加密算法。在信息安全技术中,经常需要验证消息的完整性,散列(Hash)函数提供了这一服务,它对不同长度的输入消息,产生固定长度的输出。这个固定长度的输出称为原输入消息的"散列"或"消息摘要"(Message digest)。散列算法不算加密算法,因为其结果是不可逆的,既然是不可逆的,那么当然不是用来加密的,而是签名。 对称性加密算法有

hash值和hash算法

隐身守侯 提交于 2020-02-29 13:50:11
hash值的作用 现在主流的还是base64编码,进行对字符串的编码。base64其实不是安全领域下的加密解密算法。虽然有时候经常看到所谓的base64加密解密。其实base64只能算是一个编码算法,对数据内容进行编码来适合传输。虽然base64编码过后原文也变成不能看到的字符格式,但是这种方式很初级,很简单。一般高级一点的程序员一眼就能看出来是不是用的base64进行编码,进而通过base64的解密,得出想要的结果。 所以使用hash值进行编码的转换,因为hash值是唯一的,不可逆的!但是通过hash编码却是可以的!二是因为hash值一串数字比较不容易辨别是不是hash值。 2.hash值 一般是把字符串或者byte[],当成一个数组进行遍历,然后转换为int类型的值。 hash主要用于信息安全领域中加密算法,它把一些不同长度的信息转化成杂乱的128位的编码,这些编码值叫做HASH值. 也可以说,hash就是找到一种数据内容和数据存放地址之间的映射关系。 3.hash值的计算算法 这个只是其中的一种算法: /** * 使用FNV1_32_HASH算法计算服务器的Hash值,这里不使用重写hashCode的方法,最终效果没区别 */ private static int getHash(String str) { final int p = 16777619; int hash =

jdk1.8新增Base64 api

我们两清 提交于 2020-02-29 12:23:20
Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法,Base64编码是从二进制到字符的过程,可用于在HTTP环境下传递较长的标识信息。采用Base64编码具有不可读性,需要解码后才能阅读 jdk1.8的java.util包中,新增了Base64的类 Base64.Decoder decoder = Base64.getDecoder(); Base64.Encoder encoder = Base64.getEncoder(); String text = "java新特性"; byte[] textByte = text.getBytes("UTF-8"); //编码 String encodedStr = encoder.encodeToString(textByte); System.out.println(encodedStr); //解码 System.out.println(new String(decoder.decode(encodedStr), "UTF8")); 来源: CSDN 作者: meihao3218 链接: https://blog.csdn.net/meihao3218/article/details/104570805

Unexpected char 0x0a in header value when using OkHttp client in Android

假装没事ソ 提交于 2020-02-29 12:00:58
问题 When sending a Base64 encoded string as header using Http, I am getting error response as Unexpected char 0x0a at 28 in header value: I99Uy+HjG5PpEhmi8vZgm0W7KDQ= Usage : String encodedHeader = Base64.encodeToString(value.getBytes(), Base64.DEFAULT); header.put("auth", encodedHeader); 回答1: 0x0a is a newline character which is forbidden in a header. Solution would be to make sure that these characters are stripped off before sending the encoded value as header. Base64.encodeToString

Unexpected char 0x0a in header value when using OkHttp client in Android

僤鯓⒐⒋嵵緔 提交于 2020-02-29 12:00:29
问题 When sending a Base64 encoded string as header using Http, I am getting error response as Unexpected char 0x0a at 28 in header value: I99Uy+HjG5PpEhmi8vZgm0W7KDQ= Usage : String encodedHeader = Base64.encodeToString(value.getBytes(), Base64.DEFAULT); header.put("auth", encodedHeader); 回答1: 0x0a is a newline character which is forbidden in a header. Solution would be to make sure that these characters are stripped off before sending the encoded value as header. Base64.encodeToString