2017-05-23 3 views
0

を使用して塩とパスワードを暗号化/復号化するためのパスワード+塩どのように私は取得しようとしています何libsodiumのPHP

  • 暗号化されlibsodium
  • ストアとそれがデータベース
  • にすると、それを読んで、それを解読(平文のパスワードを認証のために返す)

パスワードを暗号化/復号化するために使用したい塩のリストがあります。 私はパスワードを暗号化するときにハッシュを取得するので、動作するようですが、私は常に戻り値としてfalseを取得する復号化します。

私はlibsodiumで暗号化/復号化に間違った方法を使用していますか、まったく間違った方向に運転していますか?暗号化/復号化のための

マイソース:

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

は、私は任意の助けに感謝します!

よろしくドム

+1

HASHはそうあなたがすることができるすべては、プレーンテキストのパスワードをハッシュで、reversableする(はず)ではありません同じ方法でHASHを比較してください – RiggsFolly

+1

なぜ、認証のために平文に変換できる必要があるのか​​説明してください。 –

+0

私は認証するためのパスワードを得て、それをローカルの暗号化されたデータベースに保存したいが、私はそれを認証のためにプレーンなものにする必要がある。 – Mayrhofer

答えて

1

あなたは、データベース内の暗号化されたデータを格納し、それを解読することができるはずです。この機能で、libsodiumを使用し、特に必要がある場合はいけません。

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

出力は、データベースに保存/取得するデータになります。

+0

私がしたいのは、mcryptのアップデートされたバージョンを見つけることです。私はlibsodiumを使用したいと思った。なぜなら、libsodiumは暗号化/復号化の最良の方法であると多くの記事を読んでいたからだ。私は、ナトリウムが働かない限り、opensslと一緒に暮らすと思う。 – Mayrhofer

1

多くの無関係なものを混ぜようとしているようです。 CRYPTO_SIGN_SEEDBYTESはパスワードハッシュとは関係のない署名のため、crypto_pwhashは暗号アルゴリズムを使用していないので、CRYPTO_PWHASH_SCRYPTSALSA208SHA256_*の定数は適用されません。ここではmd5()が何をするのか分かりません。また、パスワードを暗号化するのではなく、ハッシュすることをお勧めします。

とにかく、crypto_pwhash_str()機能は必要なすべてを行います。それは、塩を作成し、パスワードをハッシュし、そしてあなたが直接データベースに格納することができ、文字列として(塩、アルゴリズムおよびそのパラメータと共に)結果をコード

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

$hあなたがする必要があるすべてでありますデータベースに格納する。その後

、どのようなデータベースを持っていることは与えられたパスワードに有効であることを確認するには:

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

あなたの助けをありがとう、それは物事を少しはっきりさせる。保存されたパスワードを再度解読することも可能ですか?私は認証のためにそれが必要なので。 – Mayrhofer

+0

パスワードは暗号化されておらず、ハッシュされています。特定のパスワードが正しいかどうかを確認することは可能ですが、データベースにあるものを考慮すると、パスワードを見つけるには多くの労力が必要です。代わりにパスワードが暗号化されている場合、アプリケーションの脆弱性により、攻撃者はすぐに使用可能なパスワードのリスト全体を取得できます。あなたのアプリケーションが知っているキーを使って暗号化されていても、ユーザーのパスワードは保存しないでください。 –

関連する問題