将带有sha的python代码转换为php

时间:2016-08-25 10:15:51

标签: php python hash sha digest

将python转换为php时出现问题。我在python中有以下代码:

user = "DdrkmK5uFKmaaeNqfqReMADSUJ4sVSLrV2A8Bvs8"
passing = "K9hvwANSBW5tLYzuWptWMByTtzZZKHzm"

sha = hashlib.sha256()
sha.update(user)
sha.update(passing)
sha_A = [ord(x) for x in sha.digest()]

sha_A是以下数组:

[231,13,239,136,20,198,76,121,67,163,251,153,114,13,65,203,41,37,64,168,43,69,81, 103,235,161,15,58,82,57,217,178]

我已将其转换为php:

$user = "DdrkmK5uFKmaaeNqfqReMADSUJ4sVSLrV2A8Bvs8";
$passing = "K9hvwANSBW5tLYzuWptWMByTtzZZKHzm"

$sha = hash_init("sha256");
$sha = hash_update($sha, $user);
$sha = hash_update($sha, $passing);

$sha_A = [];
$i = 0;
$digest = openssl_digest($sha, "sha256");
$digest = str_split($digest);
foreach ($digest as $x) {
  $sha_A[$i] = ord($x);
  $i = $i + 1;
}

但是返回的数组$sha看起来像这样:

[101,51,98,48,99,52,52,50,55,56,102,99,49,99,49,52,57,97,102,98,102,52,99, 56,57,57,54,102,98,57,50,52]

也许你们中的一些人会发现我的错误?

1 个答案:

答案 0 :(得分:0)

我在PHP代码中看到了一些错误。

这是一个python片段:

>>> sha = hashlib.sha256()
>>> sha.update(user)
>>> sha.update(passing)
>>> sha_A = [ord(x) for x in sha.digest()]
[135, 146, 107, 215, 70, 126, 179, 21, 19, 177, 191, 236, 182, 136, 192, 53, 148, 42, 160, 24, 63, 224, 170, 211, 32, 131, 59, 146, 60, 162, 77, 2]

PHP版本,更正:

$ctx = hash_init('sha256');
hash_update($ctx, $user);
hash_update($ctx, $passing);
$digest = hash_final($ctx, true);

$sha_A = [];
foreach (str_split($digest) as $x) {
    $sha_A[] = ord($x);
}
[135, 146, 107, 215, 70, 126, 179, 21, 19, 177, 191, 236, 182, 136, 192, 53, 148, 42, 160, 24, 63, 224, 170, 211, 32, 131, 59, 146, 60, 162, 77, 2]

在您的PHP版本中,$sha = hash_update($sha, $user);很糟糕,因为hash_update返回一个布尔值。第一个参数称为context,是hash_init的结果,第二个参数是要散列的数据。最后,您使用最后一个参数(raw_output)调用hash_finaltrue以获取二进制数据。

上一个错误,在SHA结果上使用openssl_digest计算了SHA摘要的摘要。有趣,不是吗? :)