【发布时间】:2022-01-27 21:14:46
【问题描述】:
我正在测试一些生成密码的代码:
<?php
//8076?
$key = '8076e852267ecefe2a80c76b66ba8ca99fb7874fa5556e8b64f4707003f4aed0';
$a = time() . $key;
print "a = $a" . PHP_EOL;
$b = sprintf('%b', $a);
print "b = $b" . PHP_EOL;
$totp = hash('sha3-256', $b);
print "totp = $totp" . PHP_EOL;
$x = gmp_init(0);
$y = gmp_init(1);
for ($i = strlen($totp) - 1; $i >= 0; $i--, $y = gmp_mul($y, 16))
$x = gmp_add($x, gmp_mul($y, hexdec($totp[$i])));
print "x = $x" . PHP_EOL;
print sprintf('%08d', gmp_strval(gmp_mod($x, '100000000')));
print PHP_EOL;
结果是:
a = 16407820138076e852267ecefe2a80c76b66ba8ca99fb7874fa5556e8b64f4707003f4aed0
b = 0
totp = f9e2eaaa42d9fe9e558a9b8ef1bf366f190aacaa83bad2641ee106e9041096e4
x = 113026826332749616999480801584179790214435636530758034338031008093509348529892
48529892
为什么 b = 000000...?
每次使用此密钥生成密码时,我都需要使用不同的密码。我知道这很愚蠢,随机数会起作用并且“安全”。安全人员让我这样做。我是一名软件工程师。
这个十六进制数有点奇怪。对于其他值,我得到了很好的结果。例如 $key = '3a8b9846009b54bb7a11e900e9b50000a6e14da4c4c2ef49f4016c326c339694' 工作正常。
【问题讨论】:
-
使用代码中的密钥(我想您正在发布测试密钥,对?),没有解释协议(或引用),并使用 @ 987654324@ 不是一个安全的随机数生成器,如果我查看了它,该代码将被送往垃圾箱。作为一名程序员,我也会对变量名提出质疑。
-
时间不会让它“随机”,它只会在下次使用时使密码不同。抱怨变量名是荒谬的。无论如何,这不是真正的代码,只是临时的临时测试。谁在乎“钥匙”从何而来? (从数据库表中解密)
-
您是否阅读了
printf()的文档?%b是做什么的? -
您可能误解了安全人员的要求。你在重新发明轮子,你真的不应该。您想要实现的目标在 RFC 4226 和 6238 中进行了描述,并且有经过充分审查的 PHP implementations。另请注意,到目前为止,您收到的唯一有用的建议(尤其是
time())是由上面的 Maarten 提供的。 -
安全人员告诉我在它的末尾贴上时间戳。感谢您提供 PHP 实现的链接。