Bash 脚本生成的“hash hmac”与 PHP 不同

Bash 脚本生成的“hash hmac”与 PHP 不同

问题

我的命令脚本生成的sometimes结果与 PHPhash_hmac命令不同。有人可以解释或举例说明应该如何完成吗?

该脚本根据时间戳生成用户名。生成不同结果的用户名示例:1611134116:admin

完整脚本

<?php
$secret="XXXXXXXXXXXX";
$user = "admin";
$ttl = 24 * 3600;  // Time to live
$time = time() + $ttl;
$username = $time . ':' . $user;
$password = base64_encode(hash_hmac('sha1', $username, $secret, true));
$password2 = base64_encode(hash_hmac('sha1', $username, $secret, true));

$result2 = base64_encode(hash_hmac('sha1', $username, $secret, true));
$result = exec("printf %s $(printf %s " . $username . " | openssl dgst -sha1 -hmac " . $secret . " -binary) | base64");

echo $username;
echo "<br><br>";
echo $result;
echo "<br>";
echo $result2;
echo "<br>";
echo ("Is equal: " . (($result === $result2) ? "true" : "false"));
echo "<br><br>";
echo $password;
echo "<br>";
echo $password2;
echo "<br>";
echo ("Is equal: " . (($password === $password2) ? "true" : "false"));

有问题的部分

$result = exec("printf %s $(printf %s " . $username . " | openssl dgst -sha1 -hmac " . $secret . " -binary) | base64");

Note:这个问题仅在输出生成为二进制时才会出现,这对我来说非常重要。

我尝试使用echo -n并停止使用variables,但问题仍然存在。

答案1

muru's评论成功了,问题与printf %s.

工作代码

$result = exec("printf %s " . $username . " | openssl dgst -sha1 -hmac " . $secret . " -binary | base64");

感谢您的时间。

相关内容