web-dev-qa-db-ja.com

1つのパスワードに対してsha512、md5とsalt暗号化をすべて実装する方法

$pass="test"

上記の変数にはtestというパスワードが含まれています.sha512md5とsaltを使用してこのパスワードをハッシュしたいのですが、saltとsha512の利点しか見つからなかったので、どうすればよいですか?すでにmd5暗号化を知っています。私のシステムはソリューションが必要です。傷つきやすい

imはまだmd5に接続されているので、コード例で説明してください


あなたのコメントと回答によって理解されたものから、iveは次のコードを取得しました

$pass="test";
$hashed_pass= openssl_digest($pass, 'sha512');

十分にしっかりしているように見えますが、[salt = '']とは何ですか?それはランダムなソルト文字列か何かを生成しますか?もしそうなら、それをどのように実装するのですか?

8
Immortal Dude

編集:この答えはまだ少し興味をそそられているようですので、皆さんを password_hash()に向けさせてください これは本質的にcrypt()のラッパーですが、はるかに簡単に使用できます。 PHP <5.5を使用している場合は、 password_compat があります。これは同じ人によって書かれ、実際には公式ドキュメントからリンクされています。

すでにcrypt()を使用している場合は、 password_verify()password_needs_rehash() はすべてのcrypt()スタイルのパスワードで機能するため、notを更新する理由はほとんどありません。


crypt() を使用すると、はるかに強力なハッシュメソッドが提供されます。

新しいパスワードをハッシュします。

// generate a 16-character salt string
$salt = substr(str_replace('+','.',base64_encode(md5(mt_Rand(), true))),0,16);
// how many times the string will be hashed
$rounds = 10000;
// pass in the password, the number of rounds, and the salt
// $5$ specifies SHA256-CRYPT, use $6$ if you really want SHA512
echo crypt('password123', sprintf('$5$rounds=%d$%s$', $rounds, $salt));
// output: $5$rounds=10000$3ES3C7XZpT7WQIuC$BEKSvZv./Y3b4ZyWLqq4BfIJzVHQweHqGBukFmo5MI8

既存のパスワードを比較します。

// the hash stored for the user
$given_hash = '$5$rounds=10000$3ES3C7XZpT7WQIuC$BEKSvZv./Y3b4ZyWLqq4BfIJzVHQweHqGBukFmo5MI8';
$test_pw = 'password123';

// extract the hashing method, number of rounds, and salt from the stored hash
// and hash the password string accordingly
$parts = explode('$', $given_hash);
$test_hash = crypt($test_pw, sprintf('$%s$%s$%s$', $parts[1], $parts[2], $parts[3]));

// compare
echo $given_hash . "\n" . $test_hash . "\n" . var_export($given_hash === $test_hash, true);
/* output:
$5$rounds=10000$3ES3C7XZpT7WQIuC$BEKSvZv./Y3b4ZyWLqq4BfIJzVHQweHqGBukFmo5MI8
$5$rounds=10000$3ES3C7XZpT7WQIuC$BEKSvZv./Y3b4ZyWLqq4BfIJzVHQweHqGBukFmo5MI8
true */
16
Sammitch

PHP> = 5.3を使用している場合、関数openssl_digestがトリックを実行する必要があります:

echo openssl_digest($pass, 'sha512');
// result
ee26b0dd4af7e749aa1a8ee3c10ae9923f618980772e473f8819a5d4940e0db27ac185f8a0e1d5f84f88bc887fd67b143732c304cc5fa9ad8e6f57f50028a8ff

echo md5($pass);
// result
098f6bcd4621d373cade4e832627b4f6

そしてPHP 5.1または5.2では、ハッシュ関数があります:

echo hash('sha512', $pass);
// result
ee26b0dd4af7e749aa1a8ee3c10ae9923f618980772e473f8819a5d4940e0db27ac185f8a0e1d5f84f88bc887fd67b143732c304cc5fa9ad8e6f57f50028a8ff

echo md5($pass);
098f6bcd4621d373cade4e832627b4f6
6
ZiupeX