データベースにパスワードを挿入する前に、sha1()
関数を使用してパスワードをハッシュしています。しかし、私はこの手順を実行して、ハッシュされるパスワードにならないようにします。
私のページでは、ユーザーをパスワードとともに登録します。送信後、最初にユーザー名をデータベースに入力し、次にそのユーザー名の一意のIDを取得します。次に、システムはそれをパスワードと組み合わせます。
_$password = $userid.$password;
_
次に、sha1()
を使用してパスワードをハッシュします。
_$password = sha1($password);
_
次に、データベース内のパスワードをそのIDで更新します。
ユーザーIDをソルトのように使用しました。
これは良いテクニックですか?システムの利用者は当社の他の部署だけですが、私の意見ではそれで十分だと思います。
また、将来的にパスワードのセキュリティを強化する必要のある大規模なプロジェクトがある場合、これで十分でしょうか?ありがとう!
ソルトは他の既知のパラメータから派生すべきではありません。ソルトはグローバルに一意である必要があります。したがって、できる最善の方法は、各パスワードに対して本当にランダムなソルトを生成することです。今日のオペレーティングシステムには「ランダムソース」がありますが、確定的コンピューターでは、このランダムソース(DEV_URANDOM)から読み取るのが最善です。
これに加えて、SHA- *ハッシュファミリーはパスワードをハッシュするのに適していません。これは、このアルゴリズムが速すぎるため、ブルートフォースを簡単に実行できないためです( Giga SHA1/s )。代わりに、BCrypt、PBKDF2、SCryptなどのコスト係数のある遅いキー派生関数を使用する必要があります。
PHPの場合、パスワードをハッシュするための専用関数が存在します。これはある方法で設計されているため、将来必要に応じてアルゴリズムを変更できますが、古いハッシュを検証できます。
// Hash a new password for storing in the database.
// The function automatically generates a cryptographically safe salt.
$hashToStoreInDb = password_hash($password, PASSWORD_DEFAULT);
// Check if the hash of the entered login password, matches the stored hash.
// The salt and the cost factor will be extracted from $existingHashFromDb.
$isPasswordCorrect = password_verify($password, $existingHashFromDb);
// This way you can define a cost factor (by default 10). Increasing the
// cost factor by 1, doubles the needed time to calculate the hash value.
$hashToStoreInDb = password_hash($password, PASSWORD_BCRYPT, array("cost" => 11));
あなたがしていることであなたがしていることには2つの問題があります:
現在受け入れられているアルゴリズムは、bcrypt、scrypt、pbkdf2の3つです。
SHA1の欠点は、高速であるため、レインボーテーブルを作成してブルートフォースするのが簡単です。ソルトを追加すると役立ちますが、パスワードが弱い場合は、「数字+弱いパスワード」がパスワードとともにRainbowテーブルにある可能性があります。
PHPは 組み込みのパスワードメカニズム を提供します。これらを使用すると、crypt
関数が自動的にソルトを生成します ハッシュされたパスワード+塩とともに保存 。
これは、PHPで(ソルト化された)パスワードハッシュを使用する推奨方法です。