- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
我正在尝试在 coldfusion 中模拟 php 函数。以下的 Php 输出;
<?php echo (strtoupper(hash_hmac('SHA256', 'a cow jumps over the moom', pack('H*','specialkey')))); ?>
结果 E9C9E66592306F1BD27A3B1991C7650D4A8920D10E5FFDA955DA692225793F35
在CF中尝试时
<cfset z=hmac("a cow jumps over the moom", "specialkey","HMACSHA256")>
结果是 1A905E37DC5F7544E170FB2D47743417AFC7CC0CE53188F30E78BC09D3A61ADF
明显是和pack(H*
部分有关,好像我跑
<?php echo (strtoupper(hash_hmac('SHA256', 'a cow jumps over the moom', 'specialkey'))); ?>
结果是1A905E37DC5F7544E170FB2D47743417AFC7CC0CE53188F30E78BC09D3A61ADF
如何在 php 中模拟 pack(H*
?我需要在 CF 中返回结果 E9C9E66592306F1BD27A3B1991C7650D4A8920D10E5FFDA955DA692225793F35
?
最佳答案
虽然看起来双方都在使用相同的 key ,但实际上并非如此。
为了生成 HMAC,PHP 和 CF 都必须首先将值解码为二进制,而该值就是实际用作“键”的值。您得到不同结果的原因是双方对键值的解码方式不同:PHP 从 hexadecimal 对其进行解码。和 CF 作为使用 JVM 默认值(即 UTF-8、ASCII 等)的纯字符串。结果,PHP 和 CF 生成了完全不同的 key ,这就是 HMAC 代码不匹配的原因。
话虽如此,我注意到您的键值“specialkey”实际上不是有效的十六进制字符串。因此,在您花大量时间讨论此问题之前,我的问题是 PHP 代码真的使用了诸如“specialkey”之类的任意字符串,还是仅用于测试目的?如果实际代码使用有效的十六进制字符串,则只需将 binary key 传递给 CF 的 HMAC 函数,结果应该是相同的:
冷聚变:
writeOutput( hmac("a cow jumps over the moom"
, binaryDecode("7370656369616c6b6579", "hex")
, "HMACSHA256"));
PHP:
echo (strtoupper(hash_hmac('SHA256', 'a cow jumps over the moom', pack('H*','7370656369616c6b6579'))));
结果:
1A905E37DC5F7544E170FB2D47743417AFC7CC0CE53188F30E78BC09D3A61ADF
更新:如果出于某种原因您确实需要使用任意字符串作为键,请查看 Perl docs for pack (PHP 函数基于此)。
免责声明:我不是真正的 PHP 专家,所以还有更多内容,但是......本质上 pack(H*)
将您的 key 字符串分成字符对并解释它们作为十六进制。 “s”、“p”、“i”等无效字符被转换为 null 或 0:
sp --> 00 ("s" and "p" are invalid)
ec --> EC ("e" and "c" are valid hex)
ia --> 0A ("i" is invalid, "a" is valid)
lk --> 00 ("l" and "k" are both invalid)
ey --> E0 ("e" is valid, "y" is invalid)
生成的二进制文件是这样的(十六进制):
00 EC 0A 00 E0
如果您将该十六进制字符串解码回二进制并将其用作 key :
hmac("a cow jumps over the moom", binaryDecode("00EC0A00E0", "hex"), "HMACSHA256")
CF 返回与 PHP 相同的结果:
E9C9E66592306F1BD27A3B1991C7650D4A8920D10E5FFDA955DA692225793F35
关于php - Coldfusion pack(H*当量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41451976/
我在运行 git gc --prune=now 并得到结果 Counting objects: 100% (619263/619263), done. Delta compression using
我想获取某个类中的所有链接。 HTML 的一个例子是 ES M3 E-mini S&P500 June 2013
我正在 32 位 ARM mcu(Atmel SAM4SD32C,Cortex-M4/ARMv7E-M 部件)上实现二进制日志记录系统,并且正在设计我的数据结构。我的目标是将日志格式描述为一个压缩结构
以下测试代码: [Test] public void PossibleHtmlAgilityPackBug() { const string html = @""; var doc =
如何利用 D3 圆包布局来得到类似这样的图表: (即使有更细长的椭圆)? 这种图表样式的关键应用是更容易放置标签。 这是 jsfiddle这演示了我为其他目的制作的圆包,但我想对于任何想要试验和测试涉
在 C 语言中,编译器将按照声明的顺序排列结构成员,并在成员之间或最后一个成员之后插入可能的填充字节,以确保每个成员都正确对齐。 gcc 提供了一个语言扩展,__attribute__((packed
在 C 语言中,编译器将按照声明的顺序排列结构成员,并在成员之间或最后一个成员之后插入可能的填充字节,以确保每个成员都正确对齐。 gcc 提供了一个语言扩展,__attribute__((packed
在我正在处理的 WPF 应用程序中尝试使用合并的 ResourceDictionaries 解决问题时,我遇到了这个奇怪的问题。 我在外部 DLL(“通用”)中定义了自定义控件(TextButton、
在使用 webpack、webpacker gem 和 Rails 5.1 时,我注意到第一次运行 rspec 会生成 public/packs 和 public/packs-test 。 这些目录是
给定一个 HTML 文档,我想识别文档中的所有数字并在数字周围添加自定义标签。现在,我使用以下内容: HtmlNodeCollection bodyNode = htmlDoc.DocumentNod
我正在尝试使用 #pragma pack (n) 对齐数据成员.以下面为例: #include using namespace std; #pragma pack(8) // or (16) str
我正在尝试让 Html Agility Pack 在我的情况下工作。我需要检测现有 HTML 页面中的所有脚本元素并删除它们,将更改保存到另一个文件。在这里,bodyNode 返回正确数量的脚本标签,
我正在使用 GitLab,需要创建一个 .gitlab-ci.yml 脚本来为生成 nuGet 包的项目运行持续集成管道。 我在寻找可靠的文档来回答这个问题时遇到严重问题: 我应该使用 dotnet
我一直在尝试查找这个问题,但没有找到有效的解决方案。我的编译器忽略了#pragma pack(push) #pragma pack(2) 和 __ attribute __ ((aligned (2)
我正在尝试在 Ubuntu 10.10 上使用 Solaris Studio for Linux。 当我尝试构建以下代码时, const char * 名称 [] = { "苹果", "橙子", "芒
我正在尝试从 HTML 中删除不必要的内容。具体来说,我想删除评论。我找到了一个很好的解决方案( Grabbing meta-tags and comments using HTML Agility
我正在VHDL中的一个项目上工作,我需要从开关中获取4位输入,并根据其他开关的值向右或向左移动一定数量的位,该按钮需要在向右/向左移位之间切换。但是,当我尝试在Xilinx ISE中实现代码时,出现以
我有一台具有 SSH 访问权限的服务器,我想在那里放置一个 Git 源代码库。我刚刚在本地创建了一个 --bare --shared 存储库并将其复制到每个 SCP 的服务器。现在我想根据 SSH u
-moz-box-pack(或 box-pack)的 justify 属性似乎在 Firefox 中被忽略了。 Live example从我们的网站。每行中的数字应该右对齐,它们在 Chrome 中也
这是我的代码。我想知道如何“正确地”读取 BMP 文件,然后在不强制打包结构的情况下读取 header 值。 typedef struct __attribute__((packed)){ uint8
我是一名优秀的程序员,十分优秀!