在 PhP 中使用哈希

问题描述 投票:0回答:1

我正在尝试按照以下步骤在 PhP 中编写验证码...

验证码的计算方式为:

  1. 验证码=整数(SHA256(哈希值)[-2:-1]) mod 10000
  2. 根据哈希值计算 SHA256,从结果中提取最右边的 2 个字节,将它们解释为大端无符号整数,并以十进制形式显示最后 4 位数字。这里始终使用 SHA256。
  3. 请注意,hash 是真正的哈希字节值,而不是 Base64 形式或十六进制表示形式。

到目前为止,我已经有了这段代码,但它并没有像我希望的那样工作:

function calculateVcode($hashString) {
  $md = hash_init('sha256');
  $hash = base64_decode($hashString);
  hash_update($md, $hash);
  $hash = hash_final($md, true);
  $last = substr($hash, -2);
  $code = bindec($last);
  return substr(strval($code), -4);
}

$hashString = "Demo string for Authentication";
$md5Hash = md5($hashString);
$result = calculateVcode($md5Hash);`

有什么想法可以让它发挥作用吗?还是我完全走错了路?

结果可能是这样的: 用于生成哈希字符串的文本 “Auðkenni APP认证”

生成的哈希字符串 n/kRNhXaZ2jFKv8KlQX7ydgedXUmVy8b2O4xNq2ZxHteG7wOvCa0Kg3rY1JLOrOBXYQm+z2FRVwIv47w8gUb5g==

根据哈希计算出的验证码 4141

php hash md5 verification
1个回答
0
投票

正确的 SHA-256 哈希需要的是 MD5 表示的原始二进制数据,而不是其编码或字符串版本。如果您从 MD5 哈希字符串开始,则应该将该字符串转换回其二进制格式(如果它是十六进制编码的),或者确保您直接处理二进制数据。

此外,将最后 2 个字节转换为整数的方式也不太正确。

bindec()
函数不适用于将二进制数据直接转换为整数,因为它解释二进制字符串,而不是原始字节。

纠正这些问题后,您应该会得到预期的结果:

function calculateVcode($hashString) {
    // Assume $hashString is already a proper byte sequence
    $hash = hash('sha256', $hashString, true); // true for raw binary output
    $lastTwoBytes = substr($hash, -2); // Get the last 2 bytes
    $value = unpack("n", $lastTwoBytes); // Unpack as a big-endian ushort (16-bit int)
    $code = $value[1] % 10000; // get last 4 digits
    return $code;
}

$originalText = "Auðkenni APP Authentication";
$hashString = base64_decode("n/kRNhXaZ2jFKv8KlQX7ydgedXUmVy8b2O4xNq2ZxHteG7wOvCa0Kg3rY1JLOrOBXYQm+z2FRVwIv47w8gUb5g==");
$result = calculateVcode($hashString);
echo "Verification code: " . $result . "\n";

顺便说一句:如果转换后的整数长度小于 4 位数字,您采用最后 4 位数字的方法可能会导致错误。

© www.soinside.com 2019 - 2024. All rights reserved.