2015-11-29 1 views
4

En PHP7, quand je hachage une chaîne comme ceci:PHP7: algorithme de hachage inconnu: SHA256

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

Je cet avertissement:

Unknown hashing algorithm: sha256 

En PHP 5.2.9, il travaillait. Le sha256 est-il obsolète en php7? Autre idée?

Remarques

  • l'extension "php_openssl.dll" est activée.
  • hachage ("sha512", "mot de passe"); // TRAVAUX !
  • print_r(hash_algos());

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

+0

Au lieu de cela essayez '" sha2 "'. – U2EF1

+0

C'est étrange, ça devrait probablement marcher: https://3v4l.org/ICYr5 – Andrea

+4

Cela dit, vous ne devriez probablement pas hacher les mots de passe avec SHA256. Utilisez password_hash. – Andrea

Répondre

2

Je sais que vous avez à travailler, mais je voulais ajouter que je l'ai regardé à travers le code source de PHP7 et il n'y a tout simplement aucune raison pour laquelle il shouldn » t travail à chaque fois.

En ./ext/hash/hash.c, nous définissons notre table de hash disponibles:

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() est également très simple:

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

Alors, que de php_hash_sha256_ops? Cela est défini dans ./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) 
}; 

En regardant le code dans ce fichier, vous pouvez également voir qu'il n'y a pas de conditions préventives dans PHP_SHA256Init(), PHP_SHA256Update() ou PHP_SHA256Final(). Je ne peux pas trouver un seul moyen possible que sha256 pourrait être désactivé.

0

J'ai eu le même problème aujourd'hui. Il s'est résolu après un redémarrage

0

Qu'est-ce que cela s'est résume à moi était qu'en raison d'un commentaire oublié dans les configs, j'utilisais mod_php avec mpm_event apache. Donc, php7 non-thread-safe dans un environnement threadé, donc la corruption de la mémoire partagée et un certain nombre de problèmes, l'un d'eux étant sha1 était indisponible après une disponibilité aléatoire.