BashスクリプトはPHPとは異なる方法で「hash hmac」を生成します。

BashスクリプトはPHPとは異なる方法で「hash hmac」を生成します。

質問

私のコマンドスクリプトはsometimesPHPhash_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'sprintf %sコメントが正常に作成されました。問題はにあります。

作業コード

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

時間をいただきありがとうございます。

関連情報