PHP7:未知的散列算法:sha256

c-t*_*sca 5 php-7

在PHP7中,当我散列这样的字符串时:

$hash = hash("sha256", "password");
Run Code Online (Sandbox Code Playgroud)

我有这个警告:

Unknown hashing algorithm: sha256
Run Code Online (Sandbox Code Playgroud)

在PHP 5.2.9中,它正在运行.是不是在php7中弃用了sha256?其他想法?

笔记

  • 扩展名"php_openssl.dll"已启用.
  • hash("sha512","password"); //工作!
  • print_r( hash_algos() );

    [0] => md2 [1] => md4 [2] => md5 [3] => sha1 [4] => sha224 [5] => sha256 [6] => sha384 [7] => sha512 ...

Wil*_*ill 2

我知道你可以让它工作,但我想补充一点,我已经查看了 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);
    // ...
}
Run Code Online (Sandbox Code Playgroud)

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);
}
Run Code Online (Sandbox Code Playgroud)

那么又怎样呢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)
};
Run Code Online (Sandbox Code Playgroud)

PHP_SHA256Init()通过查看此文件中的代码,您还可以看到、PHP_SHA256Update()或中没有预防条件PHP_SHA256Final()。我找不到任何可能sha256被禁用的方法。