開発者セキュリティ ガイド: ユーザー パスワードを安全に保存する方法
0×00 はじめに
まず、暗号の概念と使用法に精通していない場合、または暗号に関するガイダンスが必要な場合は、このコンテンツを読むことをお勧めします。
安全性に関する推奨事項にも有効期限があるべきであることは以前に明らかにしました。したがって、これまでに公開したほとんどのブログ投稿とは異なり、上記のコンテンツは実際には「継続的に更新」されており、セキュリティのニーズが変化し、新しい攻撃形態が発見されると、それに応じて変更に対応します。
ここで、パスワード セキュリティの観点を提案します。プレーン テキストのパスワードを保存せず、パスワードのハッシュ値を保存します。
実際、安全なパスワード ハッシュの生成は非常に簡単になりました。
しかし、ここで問題が発生します。このアカウントとパスワードを通じて、他の人があなたのプログラムにログインできるようにする必要があるかもしれません。
この問題の解決策も非常に簡単です - libsodium を使用します。ほとんどの言語に安全なパスワード ハッシュ API を提供します。バージョン 1.0.8 より前は scrypt アルゴリズムを使用していましたが、バージョン 1.0.9 からは、ハッシュ化されたパスワードの最近の比較から慎重に選択されたアルゴリズムである Argon2 も提供します。 Libsodium は、ほとんどのプログラミング言語にバインディングを提供します。
Libsodium ファイル
Libsodium ソース コード
注: Argon2i (Argon2 ユニバーサル パスワード ハッシュのバリアント表現) に対する攻撃がここで発表されます。実際にはその影響は深刻ではありませんが、新しい亜種につながる可能性があります (これらの攻撃を軽減するためにメモリを上書きする代わりに XOR を使用する可能性があるため、おそらく Argon2x)。
さまざまな理由で libsodium のインストールと要件を調和させることができない場合は、他の選択肢があります。このブログを準備するにあたり、私たちのチームは複数のプログラミング言語でいくつかのパスワード ハッシュ ライブラリを研究しました。ここではサンプル コードを使用してそれらを紹介します。
現在受け入れられているパスワード ハッシュ アルゴリズムは次のとおりです:
パスワード ハッシュ コンペティションの勝者である Argon2
bcrypt
scrypt
およびパスワード ハッシュ コンペティションに参加しているその他のアルゴリズム (Catena、Lyra2、Makwa、yescrypt)
PBKDF2 最悪の選択肢
0×01 PHP
PHP 最初の選択肢
まず、使用しているバージョンが PHP をサポートしているかどうかを確認してください。サポートされている場合、PHP パスワード API が使用できるようになります。サポートされていない場合は、アップグレードを試みてください。それでも動作しない場合は、password_compat を確認してください。
うわーどうやら、password_hash() はソルト付きハッシュ値を使用しているようです。実際の状況に応じて調整してください。ハードウェアがサポートしている場合は、絶対値の最小値 10.12 を使用するのが適切です。デフォルトは 10 です。
$hash = password_hash($userPassword, PASSWORD_DEFAULT);
実際、パスワードのハッシュされたストレージを検証するのは非常に簡単です:
$hash = password_hash($userPassword, PASSWORD_DEFAULT, ['cost' => 12]);
PHP7 では、PASSWORD_DEFAULT は依然として bcrypt を使用します。将来のバージョンでは、徐々に Argon2 になる可能性があります
PHP の 2 番目のオプション
libsodium にアクセスできない場合でも (もちろんアクセスすることを強くお勧めします)、PHP で暗号化ハッシュを使用できます。 Dominic Black の PECL からの Scrypt PHP 拡張機能。
そうです次に、PHP ラッパーをプロジェクトにバンドルします。
if (password_verify($userPassword, $hash)) { // Login successful. if (password_needs_rehash($userPassword, PASSWORD_DEFAULT, ['cost' => 12])) { // Recalculate a new password_hash() and overwrite the one we stored previously }}
0×02 JAVA
JAVA の最初のソリューション
libsodium に加えて、bcrypt パスワード ハッシュ アルゴリズムを提供できる jBCrypt もあります。
#If you don't have PECL installed, get that first.pecl install scryptecho "extension=scrypt.so" > /etc/php5/mods-available/scrypt.iniphp5enmod scrypt
Java で bcrypt ハッシュを検証します:
# Hashing$hash = \Password::hash($userProvidedPassword);# Validationif (\Password::check($userProvidedPassword, $hash)) { // Logged in successfully.}
JAVA 2 番目のオプション
scrypt の Java 実装がありますが、パラメータを指定する必要があり、デフォルト値は提供されません。
String hash = BCrypt.hashpw(userProvidedPassword, BCrypt.gensalt());
0×03 C# .NET
C# (.NET) 最初のオプション
PBKDF2-SHA1 である System.Security.Cryptography.Rfc2898DeriveBytes の代わりに Martin Steel の BCrypt.NET フォークをお勧めします (PBKDF2 ではありません) -SHA1 は安全ではありませんが、bcrypt の方が比較的優れています
if (BCrypt.checkpw(userProvidedPassword, hash)) { // Login successful.}
C# (.NET) の 2 番目の解決策
NuGET には Scrypt パッケージもあります
# Calculating a hashint N = 16384;int r = 8;int p = 1;String hashed = SCryptUtil.scrypt(passwd, N, r, p);# Validating a hashif (SCryptUtil.check(passwd, hashed)) { // Login successful}
0×04 Ruby
Ruby の 1 番目の解決策
いつものように。 、これは bcrypt パスワード ハッシュ用の Ruby gem です
// Calculating a hashstring hash = BCrypt.HashPassword(usersPassword, BCrypt.GenerateSalt());// Validating a hashif (BCrypt.Verify(usersPassword, hash)) { // Login successful}
この記事の公開時点では、このライブラリはまだ暗号化エンコードのベスト プラクティスに従っていないことに注意してください。そのため、これを考慮する必要があります。パッチする時間
rubyの2番目のオプションrubyのscrpytハッシュリングRuby bcrypt Python パッケージ (GitHub)
うろ覚えですAPI の名前が間違っているにもかかわらず (「ハッシュ」ではなく「暗号化」)、Python 開発者は通常 passlib (Bitbucket) を好みます。
from passlib.hash import bcrypt# Calculating a hashhash = bcrypt.encrypt(usersPassword, rounds=12)# Validating a hashif bcrypt.verify(usersPassword, hash): # Login successful
Python 第二种方案
目前我们发现除了libsodium以外只有 django-scrypt package .可以较为健全的实现。其他的我们还在寻找中。
0×06 Node.js
Node.js 第一种方案
在Node.js上bcrypt( https://www.npmjs.com/package/bcrypt)有两种安全的实现方式,尽管bcrypt看起来是首选。
在下面的例子中,我们大量的使用了Promises来简化错误处理:
var Promise = require("bluebird");var bcrypt = Promise.promisifyAll(require("bcrypt"));function addBcryptType(err) { // Compensate for `bcrypt` not using identifiable error types err.type = "bcryptError"; throw err;}// Calculating a hash:Promise.try(function() { return bcrypt.hashAsync(usersPassword, 10).catch(addBcryptType);}).then(function(hash) { // Store hash in your password DB.});// Validating a hash:// Load hash from your password DB.Promise.try(function() { return bcrypt.compareAsync(usersPassword, hash).catch(addBcryptType);}).then(function(valid) { if (valid) { // Login successful } else { // Login wrong }});// You would handle errors something like this, but only at the top-most point where it makes sense to do so:Promise.try(function() { // Generate or compare a hash here}).then(function(result) { // ... some other stuff ...}).catch({type: "bcryptError"}, function(err) { // Something went wrong with bcrypt});
Node.js 第二种方案
我们推荐 scrypt for humans,这是一个对开发人员很友好的 node-scrypt 包装器,非常容易使用。
var Promise = require("bluebird");var scrypt = require("scrypt-for-humans");// Calculating a hash:Promise.try(function() { return scrypt.hash(usersPassword);}).then(function(hash) { // Store hash for long term use});// Validating a hash:Promise.try(function() { return scrypt.verifyHash(usersPassword, hash);}).then(function() { // Login successful}).catch(scrypt.PasswordError, function(err) { // Login failed});
*原文地址: paragonie ,东二门陈冠希/编译 0xroot后期整理,转载请注明来自FreeBuf黑客与极客(FreeBuf.COM)

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











PHPでは、Password_hashとpassword_verify関数を使用して安全なパスワードハッシュを実装する必要があり、MD5またはSHA1を使用しないでください。 1)password_hashセキュリティを強化するために、塩値を含むハッシュを生成します。 2)password_verifyハッシュ値を比較して、パスワードを確認し、セキュリティを確保します。 3)MD5とSHA1は脆弱であり、塩の値が不足しており、最新のパスワードセキュリティには適していません。

PHPとPythonにはそれぞれ独自の利点があり、プロジェクトの要件に従って選択します。 1.PHPは、特にWebサイトの迅速な開発とメンテナンスに適しています。 2。Pythonは、データサイエンス、機械学習、人工知能に適しており、簡潔な構文を備えており、初心者に適しています。

PHPは、電子商取引、コンテンツ管理システム、API開発で広く使用されています。 1)eコマース:ショッピングカート機能と支払い処理に使用。 2)コンテンツ管理システム:動的コンテンツの生成とユーザー管理に使用されます。 3)API開発:RESTFUL API開発とAPIセキュリティに使用されます。パフォーマンスの最適化とベストプラクティスを通じて、PHPアプリケーションの効率と保守性が向上します。

PHPは、サーバー側で広く使用されているスクリプト言語で、特にWeb開発に適しています。 1.PHPは、HTMLを埋め込み、HTTP要求と応答を処理し、さまざまなデータベースをサポートできます。 2.PHPは、ダイナミックWebコンテンツ、プロセスフォームデータ、アクセスデータベースなどを生成するために使用され、強力なコミュニティサポートとオープンソースリソースを備えています。 3。PHPは解釈された言語であり、実行プロセスには語彙分析、文法分析、編集、実行が含まれます。 4.PHPは、ユーザー登録システムなどの高度なアプリケーションについてMySQLと組み合わせることができます。 5。PHPをデバッグするときは、error_reporting()やvar_dump()などの関数を使用できます。 6. PHPコードを最適化して、キャッシュメカニズムを使用し、データベースクエリを最適化し、組み込み関数を使用します。 7

PHPは依然として動的であり、現代のプログラミングの分野で重要な位置を占めています。 1)PHPのシンプルさと強力なコミュニティサポートにより、Web開発で広く使用されています。 2)その柔軟性と安定性により、Webフォーム、データベース操作、ファイル処理の処理において顕著になります。 3)PHPは、初心者や経験豊富な開発者に適した、常に進化し、最適化しています。

PHPタイプは、コードの品質と読みやすさを向上させるためのプロンプトがあります。 1)スカラータイプのヒント:php7.0であるため、基本データ型は、int、floatなどの関数パラメーターで指定できます。 3)ユニオンタイプのプロンプト:PHP8.0であるため、関数パラメーターまたは戻り値で複数のタイプを指定することができます。 4)Nullable Typeプロンプト:null値を含めることができ、null値を返す可能性のある機能を処理できます。

PHPとPythonには独自の利点と短所があり、選択はプロジェクトのニーズと個人的な好みに依存します。 1.PHPは、大規模なWebアプリケーションの迅速な開発とメンテナンスに適しています。 2。Pythonは、データサイエンスと機械学習の分野を支配しています。

PHPは、特に迅速な開発や動的なコンテンツの処理に適していますが、データサイエンスとエンタープライズレベルのアプリケーションには良くありません。 Pythonと比較して、PHPはWeb開発においてより多くの利点がありますが、データサイエンスの分野ではPythonほど良くありません。 Javaと比較して、PHPはエンタープライズレベルのアプリケーションでより悪化しますが、Web開発により柔軟性があります。 JavaScriptと比較して、PHPはバックエンド開発により簡潔ですが、フロントエンド開発のJavaScriptほど良くありません。
