【问题标题】:base64 decoding works differently in node than in php, perl or pythonbase64 解码在 node 中的工作方式与在 php、perl 或 python 中不同
【发布时间】:2017-05-29 11:36:03
【问题描述】:

我需要为身份验证字符串解码 base64 令牌,我在 Python、Perl 和 PHP 中找到了一些工作示例,并在 Node 中编写了等效代码,但遇到了一个问题。 Node 的 base64 解码器似乎与其他 3 种语言的工作方式不同。

在 Python 中运行它

token = 'BaSe64sTRiNghERe'
decoded_token = token.decode('base64')
print decoded_token

返回这个字符串

???F#`?D^

在 Perl 中运行

my $token = 'BaSe64sTRiNghERe';
my $decoded_token = decode_base64($token);
print $decoded_token;

返回这个字符串

???F#`?D^

在 PHP 中运行它

$token = 'BaSe64sTRiNghERe';
$decoded_token = base64_decode($token, true);
echo $decoded_token;

返回这个字符串

???F#`?D^

最后,在 Node 脚本中运行它

var token = 'BaSe64sTRiNghERe',
decoded_token = Buffer.from(token, 'base64').toString();
console.log(decoded_token);

返回这个字符串

????F#`?D^

问题是,为什么解码后的字符串中有多余的问号?以及如何在 Node 中获得与在 Perl、Python 和 PHP 中相同的结果?

更新

在命令行中运行

echo BaSe64sTRiNghERe | base64 --decode

提供与 perl、python 和 php 脚本相同的输出

但从节点运行相同的命令

var exec = require('child_process').exec;
exec('echo BaSe64sTRiNghERe | base64 --decode', function callback(error, stdout, stderr){
    console.log(stdout);
});

我仍然得到错误的东西。

【问题讨论】:

  • 您是否尝试过真正的令牌 - 即。 QmFTZTY0c1RSaU5naEVSZQ== - 解码后得到BaSe64sTRiNghERe

标签: php python node.js base64 decoding


【解决方案1】:

输出是不同的,因为您生成了不可打印的字符,并且 node 似乎以与其他语言不同的方式处理这些不可打印的字符。您还会丢失信息:

>>> token = 'BaSe64sTRiNghERe'
>>> decoded_token = token.decode('base64')
>>> print decoded_token
???F#`?D^
>>> decoded_token[0] == decoded_token[1]
False

如果你修改你的 python sn-p 看起来像这样:

import binascii
token = 'BaSe64sTRiNghERe'
decoded_token = binascii.hexlify(token.decode('base64'))
print(decoded_token)

然后修改你的 nodejs sn-p 看起来像这样:

var token = 'BaSe64sTRiNghERe',
decoded_token = Buffer.from(token, 'base64').toString('hex');
console.log(decoded_token);

您将避免它们在处理不可打印字符方面的差异,并看到 base64 解码具有相同的字节值。

【讨论】:

  • 进一步,我需要这样做key = decoded_token[:5] text = 'concatenated data here' digest = hmac.new(key, text, hashlib.sha1).digest() print digest.encode('hex') 节点中的等价物是key = decoded_token.substr(0, 5); text = 'concatenated data here'; digest = crypto.createHmac('sha1', key).update(text).digest('hex'); console.log('digest', digest) 并且它们输出不同的十六进制值。 (如果我使用相同的密钥创建hmac,则十六进制值相同)
猜你喜欢
  • 2020-04-18
  • 1970-01-01
  • 1970-01-01
  • 2012-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-21
相关资源
最近更新 更多