есть проблема с преобразованием 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
это следующий массив:
Я уже преобразовал его в 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
выглядит так:
Может быть, некоторые из вас найдут мою ошибку?
Я видел несколько ошибок в вашем коде 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, второй — данные для хеширования. Наконец, вы звоните hash_final с последним параметром (raw_output
) чтобы true
чтобы получить двоичные данные.
Последняя ошибка, используя openssl_digest
по результатам SHA вычислялся дайджест дайджеста SHA. Забавно, не правда ли? :).
Других решений пока нет …