首页 > 解决方案 > 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 的哪个变体用于以这种方式进行编码?

标签: node.jsbase64

解决方案


简短的回答

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 });
});

这个 POC 的输出是: Base64 NodeJS 缓冲区结果

因此,与此输出匹配的 Base64 变体表Base64 RFC 4648 §4中唯一的变体是:

变体结论


推荐阅读