erlang的base64解码问题
在收到客户端的数字签名signature后,需要对signature做base64的解码。代码如下所示:
validate(SignedRequest) ->
RequestParts = string:split(SignedRequest, "."),%% 数字签名+'.'+algorithm, player_id等信息
Part1Original = lists:nth(1, RequestParts), Rem = byte_size(Part1Original) rem 4,
Suffix = case Rem of
2 -> "==";
3 -> "="
end,
Part1AppendSuffix = unicode:characters_to_binary([Part1Original, Suffix]), %% 填充'='
Part1Replaced1 = unicode:characters_to_binary(string:replace((Part1AppendSuffix), <<"-">>, <<"+">>, all), utf8), %% 替换'-'为'+'
Part1Replaced2 = unicode:characters_to_binary(string:replace(Part1Replaced1, <<"_">>, <<"/">>, all), utf8), %% 替换'_'为'/'
Signature = base64:decode(Part1Replaced2), DataHash = crypto:hmac(sha256, <<YOUR_APP_SECERT>>, lists:nth(2, RequestParts)),
case Signature =:= DataHash of
true -> success;
false -> failure
end.
向signature尾部追加'='的操作是Facebook官方示例中所没有的,Facebook示例在JavaScript的环境中测试时也是正常的,但是在erlang中调用base64:decode()时,若不做此追加处理,总是在最后的环节无法匹配前三个字节。无奈,根据报错提示找来base64.erl的对应代码,如下:
decode([], A) -> A;
decode([$=,$=,C2,C1|Cs], A) ->
Bits2x6 = (b64d(C1) bsl 18) bor (b64d(C2) bsl 12),
Octet1 = Bits2x6 bsr 16,
decode(Cs, [Octet1|A]);
decode([$=,C3,C2,C1|Cs], A) ->
Bits3x6 = (b64d(C1) bsl 18) bor (b64d(C2) bsl 12)
bor (b64d(C3) bsl 6),
Octet1 = Bits3x6 bsr 16,
Octet2 = (Bits3x6 bsr 8) band 16#ff,
decode(Cs, [Octet1,Octet2|A]);
decode([C4,C3,C2,C1| Cs], A) ->
Bits4x6 = (b64d(C1) bsl 18) bor (b64d(C2) bsl 12)
bor (b64d(C3) bsl 6) bor b64d(C4),
Octet1 = Bits4x6 bsr 16,
Octet2 = (Bits4x6 bsr 8) band 16#ff,
Octet3 = Bits4x6 band 16#ff,
decode(Cs, [Octet1,Octet2,Octet3|A]).
可以看到,它只匹配4种情形,而报错时剩余前3个字节无法匹配(注意是逆序处理的),可以推定被解码的字节数不足。这里一篇博客对Base64有很清晰的讲解:
http://www.ruanyifeng.com/blog/2008/06/base64.html
在加密前,字节数组是每3个字节为一组被编码为4个字节的。当剩余字节数不足3时,有剩余1个字节和2个字节两种情形,前者被编码为2个字节,需要向尾部追加"==",后者被编码为3个字节,需要向尾部追加"="。而erlang这里报错时,我统计了签名的字节数,是不能被4整除的。因此先判断字节数,并据字节数追加相应的'=',并测试成功。
使用JavaScript的库crypto-js测试时没有出现此问题,猜想其内部可能根据字节数做了追加处理,具体就不再深究了。
erlang的base64解码问题的更多相关文章
- C# Base64解码 二进制输出
具体的:Base64编码解码还需要学习 /// <summary> /// base64 解码Excel下载 /// </summary> /// <param name ...
- 微信小程序之图片base64解码
不知道大家在做微信小程序的时候遇到base64解码的问题,我之前在做微信小程序的时候遇到base64解析图片一直有问题,所以在这里把遇到的问题和解决方案在这里记录一下: 在平时的项目中我们是直接用ba ...
- 将图片文件转化为字节数组字符串,并对其进行Base64编码处理,以及对字节数组字符串进行Base64解码并生成图片
实际开发中涉及图片上传并且量比较大的时候一般处理方式有三种 1.直接保存到项目中 最老土直接方法,也是最不适用的方法,量大对后期部署很不方便 2.直接保存到指定路径的服务器上.需要时候在获取,这种方式 ...
- SqlServer Base64解码中文
最近在做一个和拥有TurboCRM相关的项目,其中需要取出客户信息的联系人字段,经过查看,这个字段在存入时用Base64加密过了 这个功能在应用层实现是很方便的,但是由于一些特殊原因,只能放到SqlS ...
- python3 base64解码出现TypeError:Incorrect padding
今天在解决爬虫对加密参数的分析时,需要使用到base64解码.但是过程中出现了TypeError:Incorrect padding的错误提示.以下是解决方法,以便查阅. 其实正常使用base64是不 ...
- 【java工具类】对字节数组字符串进行Base64解码并生成图片
import java.io.File;import java.io.FileOutputStream;import java.io.OutputStream;import org.springfra ...
- base64解码
网络传输经常用base64编码的数据,因此我们需要将其解码成正常字符集合. base64.h #ifdef __cplusplus extern "C" { #endif char ...
- bootstrap-wysiwyg 结合 base64 解码 .net bbs 图片操作类 (二) 图片裁剪
图片裁剪参见: http://deepliquid.com/projects/Jcrop/demos.php?demo=thumbnail 一个js插件 http://www.mikes ...
- bootstrap-wysiwyg 结合 base64 解码 .net bbs 图片操作类
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Dr ...
随机推荐
- R语言入门--画图(一)--ggplot2
先写一些需要用到的知识点,比如包.函数 dplyr 很好用的包 经常与ggplot2连用 mutate:用于对数据框的列进行重新处理,或者用处理的结果添加新列 数据清洗: 1.na.omit() ...
- R语言入门视频笔记--5--自定义函数
自定义函数 你可以输出一段代码,创建一个你自己定义的函数 蛋是如果你两个自定义函数的名字重复的话,后面的会把前面的替换掉 举个栗子: hanshu1 <- function(x) sqrt(v ...
- AC日记——A+B Problem(再升级) 洛谷 P1832
题目背景 ·题目名称是吸引你点进来的 ·实际上该题还是很水的 题目描述 ·1+1=? 显然是2 ·a+b=? 1001回看不谢 ·哥德巴赫猜想 似乎已呈泛滥趋势 ·以上纯属个人吐槽 ·给定一个正整数n ...
- hadoop学习 的yarn
Yarn的产生 mapReduc1.0 1单点故障 2扩展效率低 3资源利用率高 降低运维成本 方便数据共享 多计算框架支持 MapReduce Spark Storm Yarn的架构图 Yarn模块 ...
- MySQL 5.6.20-4 and Oracle Linux DTrace
https://blogs.oracle.com/wim/entry/mysql_5_6_20_4?utm_source=tuicool&utm_medium=referral By WimC ...
- widows 2008 同步时间命令
由于windows2008没有提供类似XP的自动同步功能,因此需要使用windows 2008计划任务来运行一行命令进行同步. 首先查看与想要同步时间的internet时间服务器的时差: w32t ...
- scp、paramiko、rsync上传下载限流、限速、速度控制方法
1.scp限速 scp -l 800 a.txt user@ip:/home/admin/downloads 此时的传输速率就是800/8=100KB左右 man -a scp查看参数含义.注意单 ...
- linux find 命令查找 复制
find 查找 find . -mtime -2 -a -path './.git*' -prune , -path './Cache' -prune -a -exec cp {} one \; rm ...
- 手写 redux 和 react-redux
1.手写 redux redux.js /** * 手写 redux */ export function createStore(reducer) { // 当前状态 let currentStat ...
- 如何干掉那些.ipch 与 .sdf文件
参考资料: http://blog.163.com/yangjun1988422@126/blog/static/47412917201074446054/ vs2010中臃肿的ipch和sd ...