我正在尝试按照以下步骤在 PhP 中编写验证码...
验证码的计算方式为:
到目前为止,我已经有了这段代码,但它并没有像我希望的那样工作:
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
正确的 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 位数字的方法可能会导致错误。