Perl hmac sha256与PHP使用包不同

韦尔奇

我必须使用SHA256 HMAC在Perl中创建哈希,例如以下PHP示例:

<?php
$key = pack('H*','THIS_IS_KEY');
$str ='THIS IS DE ENCODED STRING';
echo strtoupper(hash_hmac('sha256',$str, $key));
?>

我得到:601B7C81389A37FC83C05275138280E8788CF9108528BC75D5C09CEA75904D5E

但是,如果我在Perl脚本中执行相同的操作:

use Digest::SHA qw(hmac_sha256_hex);
my $key = pack('H*','THIS_IS_KEY');
my $str ='THIS IS DE ENCODED STRING';
print uc(hmac_sha256_hex($str, $key));
exit;

我得到:C683FD81DEFB7CDA3C031F5280682E80851FDC246310DB8C44057BC6364454E0

如果我不打包密钥,Perl或PHP都不会得到相同的结果,不幸的是,我必须生成与使用PHP“ pack”的示例完全相同的结果。

如果有人可以帮助我找到解决方案,我将不胜感激。

提前致谢

韦尔奇

run缩

代码不了解该pack()函数的实际工作方式。关键是PHP和Perl脚本之间的区别是什么,因此我们将其简化为该计算。这是一个更简单的PHP程序:

<?php
  $key = pack('H*', 'THIS_IS_KEY');
  echo $key;
?>

如果将其回显到php | hexdump,则会得到:

00000000 0000 0000 000e

这是一个类似的Perl程序:

my $key = pack('H*', 'THIS_IS_KEY');
print $key;

如果将其回显到perl | hexdump,我们将得到:

0000000 2cd1 cff2 204e

这是两个明显不同的键。在这两种情况下,pack()调用都使用一种H*格式,这意味着pack()期望接收到无限制的十六进制字符串(包含十六进制字符0-9A-F的字符串)。问题在于这'THIS_IS_KEY'不是十六进制值的序列(“ E”除外)。如果通过php二进制文件本身运行测试代码,您还将看到以下几行:

PHP Warning:  pack(): Type H: illegal hex digit T in - on line 2
PHP Warning:  pack(): Type H: illegal hex digit H in - on line 2
PHP Warning:  pack(): Type H: illegal hex digit I in - on line 2
PHP Warning:  pack(): Type H: illegal hex digit S in - on line 2
PHP Warning:  pack(): Type H: illegal hex digit _ in - on line 2
PHP Warning:  pack(): Type H: illegal hex digit I in - on line 2
PHP Warning:  pack(): Type H: illegal hex digit S in - on line 2
PHP Warning:  pack(): Type H: illegal hex digit _ in - on line 2
PHP Warning:  pack(): Type H: illegal hex digit K in - on line 2
PHP Warning:  pack(): Type H: illegal hex digit Y in - on line 2

请注意,除了“ E”之外,都是每个字符都会引发错误,并且请注意,在您的十六进制输出中,“ E”之外,每个字符都会转换为空半字节Perl实际上尝试制作一些无意义的字符并将其转换为它可以使用的某种表示形式(例如,“ K”变为4,这是有道理的,因为它是F之后的第5个字符,它对应于十六进制的14)。无论如何,应该向行为传递不匹配格式的字符串是不确定的。

那么,您有什么解决方案?

好吧,如果您真的需要保留'THIS_IS_KEY'键,那么等效的Perl键是'000000000E0'如果您的示例键只是键值的表示形式,则通常在Perl脚本中将PHP键中的非十六进制字符替换为“ 0”。PHP似乎将十六进制字符串中的非十六进制字符视为“ 0”。

对于真正的解决方案,在将传递给之前,要么将您的字符串键转换为十六进制表示形式,要么使用正十六进制值作为键pack()我不知道键选择的详细信息,也不知道为什么为什么要打包“键”。代码的SHA256部分仅将字节字符串作为键。只要这两个脚本使用相同的字节序列,它就可以是纯ASCII密钥。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Perl hmac sha256与PHP使用包不同

来自分类Dev

在Ruby中使用HMAC SHA256

来自分类Dev

为什么PHP的hash_hmac('sha256')与Java sha256_HMAC给出不同的结果

来自分类Dev

为什么HMAC sha256在PHP和Javascript上返回不同的值

来自分类Dev

PHP和C#HMAC SHA256

来自分类Dev

使用C ++中的键生成HMAC SHA256哈希

来自分类Dev

使用 OpenSSL 1.1 的 SHA256 HMAC 未编译

来自分类Dev

HMAC + SHA256 jwt机密长度

来自分类Dev

C ++(DynamoDB)中的HMAC SHA256

来自分类Dev

hmac sha256 输出长度

来自分类Dev

命令行HMAC计算与Node.JS crypto.createHmac('sha256')不同

来自分类Dev

像这样的php函数,如何在Rails中用hash_hmac使用sha256加密数据

来自分类Dev

PHP中的HMAC-SHA-256

来自分类Dev

HMAC SHA256 JWT签名不正确

来自分类Dev

Shopify C#HMAC SHA256 OAuth验证

来自分类Dev

C#中的HMAC SHA256哈希计算

来自分类Dev

HMAC SHA256不返回预期的哈希

来自分类Dev

使用cryptojs通过SHA256算法生成符合RFC 2104的HMAC

来自分类Dev

HMAC 和 SHA256 - 如何使用随机数进行验证

来自分类Dev

使用 hmac 和 sha256 的 Python 加密没有给出与 javascript 相同的结果

来自分类Dev

C#(Windows应用程序8.1)HMAC SHA256与其他语言不同(太短了吗?)

来自分类Dev

HMAC 256与HMAC 512 JWT签名加密

来自分类Dev

Java和Python生成不同的Hmac-SHA256输出

来自分类Dev

对于PBKDF2,使用HMAC-SHA256比使用HMAC-SHA-1更安全?

来自分类Dev

将PHP POST响应的JSON主体编码为HMAC SHA256,然后编码为Base64

来自分类Dev

在JavaScript中计算HMAC_SHA256?

来自分类Dev

使用BouncyCastle生成HMAC-SHA256哈希

来自分类Dev

尝试使用C#.Net编码HMAC-SHA256

来自分类Dev

使用HMAC-SHA256的Python编码消息

Related 相关文章

热门标签

归档