node.js - Buffer.toString('base64') 创建了哪种 base64 编码变体?
问题描述
在 Node.js 中,通常使用内置Buffer
创建 base64 编码数据:
const data = 'Hello world!';
const base64encoded = Buffer.from(data, 'utf8').toString('base64');
console.log(base64encoded); //prints "SGVsbG8gd29ybGQh"
在撰写本文时,维基百科列出了不少于 14个 base64 变体。但是,Buffer 手册页并没有指定实际使用的 base64 变体。
是否有任何权威来源说明 base64 的哪个变体用于以这种方式进行编码?
解决方案
简短的回答:
Buffer.toString('base64')的Base64 变体是:
Base64 标准 RFC 4648 §4
更长的答案(为什么以及如何):
为什么我需要它?
最近我还需要找到它,并首先在 Google 中搜索弹出这篇带有未回答问题的帖子。所以这就是我如何找到它以及为什么我首先需要它。
我们的系统与不同的客户端和 3rd 方组件进行通信,它们有时具有不同的默认 Base64 变体,一些 has Base64 RFC 2045
,一些 has Base64 RFC 4648 §5
,一些 hasBase64 RFC 4880
和一些Base64 RFC 4648 §4
。
如果一方(发送方)使用与解码方(接收方)不同的变体将数据编码为 Base64,那么接收方可能会遇到运行时异常。所以需要通过服务器统一编码格式。
我是怎么找到的?
我做的第一件事 - 我检查了 Buffer 实现的源代码,希望在评论中找到任何文档化的参考。但我没有找到任何明确的变体规范,它只声明它支持 base64 作为它的内部之一BufferEncoding
。
我做的第二件事——我在本地 docker 上创建了一个小型 POC,它对所有 ASCII 字符进行编码和解码——并将输出与所有Base64 变体表匹配
这是我的节点 POC 的代码:
// Raw bytes for all ASCII from 0 to 127
function dataAscii(){
const bytes = [];
for(let i=0; i<127; i++){
bytes.push(i);
}
return Buffer.from(bytes);
}
router.get('/base64-check', function(req, res, next) {
// Encode into base64 using the default variant of NodeJS
const encodedBase64 = dataAscii().toString('base64');
// Check if padding with '=' is mandatory or optional
const noPad = encodedBase64.replace(/=/g, '');
let optionalPad;
try{
Buffer.from(noPad, 'base64').toString('binary');
optionalPad = true;
}catch(e){
console.error(e);
optionalPad = false;
}
res.status(200).send({ encodedBase64, optionalPad });
});
因此,与此输出匹配的 Base64 变体表Base64 RFC 4648 §4
中唯一的变体是:
推荐阅读
- java - 正则表达式匹配多个 if then else 条件
- c++ - 如何在不使用任何数据库的情况下制作动态注册表单?
- nginx - Nginx - 反向代理 - UDP
- r - 有没有办法用 R 将 html 代码嵌入到工具提示中?
- swift - Quicklook 总是显示“没有要预览的文件”错误(网址有效)
- r - 计算产品价格变动后的天数
- excel - Excel 2016 Office 365 灾难性故障
- kubernetes - 无法访问 taint 节点上的 Kubernetes 集群服务
- javascript - 在android上关闭应用程序时反应本机运行作业
- c# - ASP.NET Web API 和 XML 序列化