2017-05-23 3 views
0

Ce que je suis en train de faire estcomment crypter/décrypter le mot de passe avec le sel en utilisant libsodium php

  • Crypter un mot de passe + sel avec libsodium
  • magasin à une base de données
  • lire et déchiffrer (obtention du mot de passe simple pour l'authentification)

J'ai reçu une liste de sels que je veux utiliser pour crypter/décrypter mon mot de passe. Lorsque je crypte le mot de passe, je reçois un hachage de sorte que l'un semble fonctionner, mais au décryptage je reçois toujours faux comme valeur de retour. Est-ce que j'utilise les mauvaises méthodes pour crypter/décrypter avec libsodium ou suis-je complètement conduire dans la mauvaise direction?

Ma source pour Crypter/Décrypter:

function encrypt_libsodium($to_encrypt, $salt_to_use){ 
     if(!$data || !$salt_to_use){ 
      return null; 
     } 

     //get stored salt 
     $this->key_ = substr(md5($this->pw_key[$salt_to_use].'_'), 0, $this->ks); 

     //some libsodium specific stuff 
     $out_len = \Sodium\CRYPTO_SIGN_SEEDBYTES; 
     $ops_limit = \Sodium\CRYPTO_PWHASH_SCRYPTSALSA208SHA256_OPSLIMIT_INTERACTIVE; 
     $mem_limit =\Sodium\CRYPTO_PWHASH_SCRYPTSALSA208SHA256_MEMLIMIT_INTERACTIVE; 

     //create hash using libsodium 
     $hash = \Sodium\crypto_pwhash($out_len, $to_encrypt, $this->key_,$ops_limit, $mem_limit); 
     return $hash; 
    } 

    function decrypt_libsodium($hash, $salt_to_use){ 
     if(!$hash || !$what){ 
      return null; 
     } 

     //get stored salt 
     $this->key_ = substr(md5($this->pw_key[$salt_to_use].'_'), 0, $this->ks); 

     //get verification hash 
     $decrypted = \Sodium\crypto_pwhash_scryptsalsa208sha256_str_verify($this->key_, $hash); 
     return $decrypted; 
    } 

Je vous remercie de toute aide!

Dom concerne

+1

HASHTABLE n'est pas (censé) être reversible, tout ce que vous pouvez faire est de hachage du mot de passe de texte brut de la même manière et comparez les – RiggsFolly

+1

de HASH Alors, expliquez pourquoi vous devez être capable de convertir en texte clair pour l'authentification? –

+0

J'ai un mot de passe pour m'authentifier et je veux le stocker dans ma base de données cryptée, mais j'en ai besoin pour l'authentification elle-même. – Mayrhofer

Répondre

1

Si vous ne avez pas besoin d'utiliser spécifiquement libsodium, avec cette fonction, vous devez être en mesure de stocker les données cryptées dans la base de données et le déchiffrer.

define("ENCRYPT_METHOD", "AES-256-CBC"); 
define("SECRET_KEY","randomtextrandomtextforthesecretkey"); 
define("SECRET_IV", "randomtextforthesecretiv"); 
function encriptar($action, $string) 
{ 
    $output = false; 
    $key = hash("sha256", SECRET_KEY); 
    $iv  = substr(hash("sha256", SECRET_IV), 0, 16); 

    if ($action == "encrypt") 
    { 
    $output = openssl_encrypt($string, ENCRYPT_METHOD, $key, 0, $iv); 
    $output = base64_encode($output); 
    } 
    else if($action == "decrypt") 
    { 
     $output = base64_decode($string); 
     $output = openssl_decrypt($output, ENCRYPT_METHOD, $key, 0, $iv); 
    } 
    return $output; 
} 

La sortie sera les données que vous allez stocker/accéder à la base de données.

+0

qui pourrait fonctionner pour moi puisque tout ce que je veux faire est de trouver une version mise à jour de mcrypt parce que celui-ci a été détruit. Je voulais utiliser libsodium parce que j'ai lu beaucoup de post disant que libsodium est le meilleur moyen de crypter/décrypter. Je pense que je vais vivre avec openssl tant que je ne reçois pas de sodium pour travailler. – Mayrhofer

1

On dirait que vous essayez de mélanger plusieurs choses sans rapport. CRYPTO_SIGN_SEEDBYTES est pour les signatures, ce qui n'a rien à voir avec le hachage de mot de passe, crypto_pwhash n'utilise pas l'algorithme scrypt, donc les constantes CRYPTO_PWHASH_SCRYPTSALSA208SHA256_* ne s'appliquent pas, et je ne suis pas sûr de ce que md5() fait ici. Et vous voulez probablement hacher le mot de passe, pas le crypter.

De toute façon, la fonction crypto_pwhash_str() fait tout ce dont vous avez besoin. Il crée un sel, hash du mot de passe et code le résultat (en même temps que le sel, l'algorithme et ses paramètres) comme une chaîne que vous pouvez stocker directement dans la base de données:

$password = 'correct horse battery staple'; 
$h = \Sodium\crypto_pwhash_str($password,         
     \Sodium\CRYPTO_PWHASH_OPSLIMIT_INTERACTIVE, 
     \Sodium\CRYPTO_PWHASH_MEMLIMIT_INTERACTIVE); 

$h est tout ce que vous devez stocker dans la base de données.

Ensuite, pour vérifier que ce que vous avez dans la base de données est valide pour un mot de passe donné:

if (\Sodium\crypto_pwhash_str_verify($h, $password) === FALSE) { 
    // wrong password! 
} 
+0

Merci pour votre aide, cela rend les choses un peu plus claires.Est-il également possible de déchiffrer à nouveau le mot de passe stocké? parce que j'en aurais besoin pour l'authentification. – Mayrhofer

+0

Les mots de passe ne sont pas cryptés, ils sont hachés. Il est possible de vérifier qu'un mot de passe donné est correct, mais étant donné ce qu'il y a dans la base de données, trouver le mot de passe demande beaucoup d'efforts. Si les mots de passe sont chiffrés à la place, une vulnérabilité dans votre application peut permettre aux pirates de récupérer la liste complète des mots de passe, immédiatement utilisables. Veuillez ne pas stocker les mots de passe des utilisateurs, même chiffrés à l'aide d'une clé connue de votre application. –