Buffer.toString('base64')创建的是哪种base64编码变体?

4
在Node.js中,通常使用内置的Buffer来创建base64编码的数据:
const data = 'Hello world!';
const base64encoded = Buffer.from(data, 'utf8').toString('base64');
console.log(base64encoded); //prints "SGVsbG8gd29ybGQh"

在撰写本文时,维基百科列出了不少于14种 base64 变体。然而,缓冲区手册页没有指定实际使用的 base64 变体。
是否有权威来源说明以这种方式进行编码所使用的 base64 变体是哪种?

在您提供的链接中,有一个指向 https://tools.ietf.org/html/rfc4648#section-5 的链接。 - iofjuupasli
@iofjuupasli - 是的,但该信息仅适用于_解码_而非_编码_。 - Robert Steward
1个回答

5

简短回答:

Buffer.toString('base64')Base64变体是:

Base64标准 RFC 4648 §4

更长回答(为什么和如何):

为什么我需要它?

最近我也需要找到它,首先在Google中搜索出现了这个没有答案的问题。所以这就是我如何找到它以及我为什么需要它的原因。

我们的系统与不同的客户端和第三方组件进行通信,其中有些具有不同的默认Base64变体,有些是Base64 RFC 2045,有些是Base64 RFC 4648 §5,有些是Base64 RFC 4880,而有些是Base64 RFC 4648 §4

如果一个方向(发送者)使用与解码方向(接收者)不同的Base64变体对数据进行编码,则接收方可能会出现运行时异常。因此,我需要通过服务器统一编码格式。

我是如何发现它的?

我首先检查了Buffer实现的源代码,希望能在注释中找到任何文档引用。但我没有找到任何明确规定变体的说明,它只说明支持base64作为其内部BufferEncoding之一。

我接着创建了一个小型的本地docker POC,将所有ASCII字符进行编码和解码,并将输出与所有Base64变体表进行匹配。

这是我的Node 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 Buffer result 所以与Base64变体表唯一匹配的变体是Base64 RFC 4648 §4:

Variant conclusion


1
我差点忘记了这个问题。干得好! - Robert Steward

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接