我知道你得到它的工作,但我想補充一點,我已經看了通過PHP7源代碼,只是我們沒有理由爲什麼不該」每次都工作。
在./ext/hash/hash.c
,我們定義表中提供的散列:
PHP_MINIT_FUNCTION(hash)
{
// ...
zend_hash_init(&php_hash_hashtable, 35, NULL, NULL, 1);
// ...
php_hash_register_algo("sha224", &php_hash_sha224_ops);
php_hash_register_algo("sha256", &php_hash_sha256_ops);
php_hash_register_algo("sha384", &php_hash_sha384_ops);
php_hash_register_algo("sha512", &php_hash_sha512_ops);
// ...
}
php_hash_register_algo()
也很簡單:
PHP_HASH_API void php_hash_register_algo(const char *algo, const php_hash_ops *ops) /* {{{ */
{
size_t algo_len = strlen(algo);
char *lower = zend_str_tolower_dup(algo, algo_len);
zend_hash_str_add_ptr(&php_hash_hashtable, lower, algo_len, (void *) ops);
efree(lower);
}
那麼什麼php_hash_sha256_ops
?這是在./ext/hash/hash_sha.c
定義:
const php_hash_ops php_hash_sha256_ops = {
(php_hash_init_func_t) PHP_SHA256Init,
(php_hash_update_func_t) PHP_SHA256Update,
(php_hash_final_func_t) PHP_SHA256Final,
(php_hash_copy_func_t) php_hash_copy,
32,
64,
sizeof(PHP_SHA256_CTX)
};
通過查看此文件中的代碼,你也可以看到有在PHP_SHA256Init()
,PHP_SHA256Update()
,或PHP_SHA256Final()
沒有預防的條件。我找不到一種可能的方式,sha256
可能被禁用。
改爲嘗試'「sha2」'。 – U2EF1
這很奇怪,它可能應該工作:https://3v4l.org/ICYr5 – Andrea
也就是說,你可能不應該用SHA256散列密碼。使用password_hash。 – Andrea