【问题标题】:Binary Conversion Results In 00000000000二进制转换结果为 00000000000
【发布时间】: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 实现的链接。

标签: php security binary hex


【解决方案1】:

您正在将字符串$a 格式化为一个没有意义的二进制数,您想对其进行转换。您需要使用pack,然后将该二进制值转换为字符串或整数,或者保持原样,无论您需要什么。

【讨论】:

  • 不,sprint('%b', $str) 将其“转换”为我想要的二进制值表示。与函数 convert_base($x, 10, 2) 相同。我不明白 pack() 函数。我只想知道为什么 b = 0。
  • 好吧,你是对的。在所有情况下,base_convert 也会搞砸。所以我必须回到绘图板上。
【解决方案2】:

现在可以了。 (十六进制字符串不包含有效的十六进制值,所以我使用了每个字符)


<?php

//$key = '8076e852267ecefe2a80c76b66ba8ca99fb7874fa5556e8b64f4707003f4aed0';
//$key = '3a8b9846009b54bb7a11e900e9b50000a6e14da4c4c2ef49f4016c326c339694';
$key = '145bfea3b819bee905b5d5295338964150c489789a9228f2e981b189de5cbbee';

$a = '';
for ($i = 0; $i < strlen($key); $i++)
   $a .= decbin(ord($key[$i]));
$a .= decbin(time());
print "a = $a" . PHP_EOL;
$totp = hash('sha3-256', $a);
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;

【讨论】:

    猜你喜欢
    • 2021-05-09
    • 2017-03-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-08
    • 2011-09-04
    • 2016-10-02
    相关资源
    最近更新 更多