原文
一、关于Base64编码:
虽然常用却没注意过,一般Base64,包含英文字母AZ、az、数字0-9,这样62个字元,然后呢,这样还少2个字元才64个,这另外两个就是+、/两个符号,最后呢,编码完成依据状况会补上=,详细的说明可以参考wiki。
https://zh.wikipedia.org/wiki/Base64
之前使用的情境通常是在http的header中使用,比如oauth相关的应用,可是当打算于url中使用base64编码时,就可以发生问题了,因为编码中包含了"+“跟”/",于QueryString使用需在编码过,在Restful的api使用时,"/“更是会造成url路径错误。
针对这个问题,Base64有一个变种,通常会说是URL and Filename Safe Alphabet,符合RFC4648, Section 5.规范,这个规范将”+"、"/“至换成”-"、"_",并移除最后的"="
二、Nodejs的Base64 encode与decode
在Nodejs常这样用
var code = new Buffer("Base64是一種基於64個可列印字元來表示二進位資料的表示方法").toString('base64');
//code:QmFzZTY05piv5LiA56iu5Z+65pa8NjTlgIvlj6/liJfljbDlrZflhYPkvobooajnpLrkuozpgLLkvY3os4fmlpnnmoTooajnpLrmlrnms5U=
console.log("code:"+code);
var decode = new Buffer(code , 'base64').toString();
//decode:Base64是一種基於64個可列印字元來表示二進位資料的表示方法
console.log("decode:"+decode);
如上面显示的结果,Buffer.toString(),指定base64时,会依据Base64的原始规范进行编码,所以会包含"+"、"/"、"="
那要怎么办?可以自己处理把"+“换成”-",把"/“换成”_",然后移除"="
//接续上一范例
//接續上一範例
//code:QmFzZTY05piv5LiA56iu5Z-65pa8NjTlgIvlj6_liJfljbDlrZflhYPkvobooajnpLrkuozpgLLkvY3os4fmlpnnmoTooajnpLrmlrnms5U
console.log("code:"+code.replace(/=/g, "").replace(/\+/g, "-").replace(/\//g, "_"));
另外也有套件可以安装,我是使用base64url
npm网址
https://www.npmjs.com/package/base64url
三、解码怎么办?
关于解码的部份,不管是基本款还是RFC4648, Section 5的版本,Nodejs的Buffer都可解码,完整的范例如下:
const base64url = require('base64url');
var code = new Buffer("Base64是一種基於64個可列印字元來表示二進位資料的表示方法").toString('base64');
//code:QmFzZTY05piv5LiA56iu5Z+65pa8NjTlgIvlj6/liJfljbDlrZflhYPkvobooajnpLrkuozpgLLkvY3os4fmlpnnmoTooajnpLrmlrnms5U=
console.log("code:"+code);
//code:QmFzZTY05piv5LiA56iu5Z-65pa8NjTlgIvlj6_liJfljbDlrZflhYPkvobooajnpLrkuozpgLLkvY3os4fmlpnnmoTooajnpLrmlrnms5U
console.log("code:"+code.replace(/=/g, "").replace(/\+/g, "-").replace(/\//g, "_"));
var decode = new Buffer(code , 'base64').toString();
//decode:Base64是一種基於64個可列印字元來表示二進位資料的表示方法
console.log("decode:"+decode);
//使用base64url轉換為url safe的Base64編碼
var safeUrl = base64url.fromBase64(code);
//safeUrl:QmFzZTY05piv5LiA56iu5Z-65pa8NjTlgIvlj6_liJfljbDlrZflhYPkvobooajnpLrkuozpgLLkvY3os4fmlpnnmoTooajnpLrmlrnms5U
console.log("safeUrl:"+safeUrl);
//decode2:Base64是一種基於64個可列印字元來表示二進位資料的表示方法
var decode2 = new Buffer(safeUrl , 'base64').toString();
console.log("decode2:"+decode2);
/**
output:
code:QmFzZTY05piv5LiA56iu5Z+65pa8NjTlgIvlj6/liJfljbDlrZflhYPkvobooajnpLrkuozpgLLkvY3os4fmlpnnmoTooajnpLrmlrnms5U=
code:QmFzZTY05piv5LiA56iu5Z-65pa8NjTlgIvlj6_liJfljbDlrZflhYPkvobooajnpLrkuozpgLLkvY3os4fmlpnnmoTooajnpLrmlrnms5U
decode:Base64是一種基於64個可列印字元來表示二進位資料的表示方法
safeUrl:QmFzZTY05piv5LiA56iu5Z-65pa8NjTlgIvlj6_liJfljbDlrZflhYPkvobooajnpLrkuozpgLLkvY3os4fmlpnnmoTooajnpLrmlrnms5U
decode2:Base64是一種基於64個可列印字元來表示二進位資料的表示方法
*/