2015-11-29 48 views
4

在PHP7,當我哈希的字符串是這樣的:PHP7:未知的散列算法:SHA256

$hash = hash("sha256", "password"); 

我有這樣的警告:

Unknown hashing algorithm: sha256 

在PHP 5.2.9,這是工作。 sha256是否在php7中棄用?其他想法?

  • 擴展 「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 ...

+0

改爲嘗試'「sha2」'。 – U2EF1

+0

這很奇怪,它可能應該工作:https://3v4l.org/ICYr5 – Andrea

+4

也就是說,你可能不應該用SHA256散列密碼。使用password_hash。 – Andrea

回答

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); 
    // ... 
} 

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可能被禁用。

0

今天我有同樣的問題。它在重新啓動後自行解決

0

對我來說簡直就是由於在配置中忘記了我的意見,所以我使用mod_php和mpm_event apache。因此,在線程環境中非線程安全的php7,因此共享內存損壞和一些問題,其中之一是sha1在一些隨機運行時間後不可用。