検索
ホームページバックエンド開発PHPチュートリアル開発者セキュリティ ガイド: ユーザー パスワードを安全に保存する方法

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)

声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
スカラータイプ、リターンタイプ、ユニオンタイプ、ヌル可能なタイプなど、PHPタイプのヒントはどのように機能しますか?スカラータイプ、リターンタイプ、ユニオンタイプ、ヌル可能なタイプなど、PHPタイプのヒントはどのように機能しますか?Apr 17, 2025 am 12:25 AM

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

PHPは、オブジェクトのクローニング(クローンキーワード)と__Clone Magicメソッドをどのように処理しますか?PHPは、オブジェクトのクローニング(クローンキーワード)と__Clone Magicメソッドをどのように処理しますか?Apr 17, 2025 am 12:24 AM

PHPでは、クローンキーワードを使用してオブジェクトのコピーを作成し、\ _ \ _クローンマジックメソッドを使用してクローン動作をカスタマイズします。 1.クローンキーワードを使用して浅いコピーを作成し、オブジェクトのプロパティをクローン化しますが、オブジェクトのプロパティはクローニングしません。 2。\ _ \ _クローン法は、浅いコピーの問題を避けるために、ネストされたオブジェクトを深くコピーできます。 3.クローニングにおける円形の参照とパフォーマンスの問題を避けるために注意し、クローニング操作を最適化して効率を向上させます。

PHP対Python:ユースケースとアプリケーションPHP対Python:ユースケースとアプリケーションApr 17, 2025 am 12:23 AM

PHPはWeb開発およびコンテンツ管理システムに適しており、Pythonはデータサイエンス、機械学習、自動化スクリプトに適しています。 1.PHPは、高速でスケーラブルなWebサイトとアプリケーションの構築においてうまく機能し、WordPressなどのCMSで一般的に使用されます。 2。Pythonは、NumpyやTensorflowなどの豊富なライブラリを使用して、データサイエンスと機械学習の分野で驚くほどパフォーマンスを発揮しています。

さまざまなHTTPキャッシングヘッダー(例:キャッシュコントロール、ETAG、ラスト変更)を説明してください。さまざまなHTTPキャッシングヘッダー(例:キャッシュコントロール、ETAG、ラスト変更)を説明してください。Apr 17, 2025 am 12:22 AM

HTTPキャッシュヘッダーの主要なプレーヤーには、キャッシュコントロール、ETAG、およびラスト修飾が含まれます。 1.Cache-Controlは、キャッシュポリシーを制御するために使用されます。例:キャッシュコントロール:Max-Age = 3600、public。 2。ETAGは、一意の識別子を介してリソースの変更を検証します。例:ETAG: "686897696A7C876B7E"。 3. Last-Modifiedは、リソースの最後の変更時間を示しています。

PHPでの安全なパスワードハッシュ(例:Password_hash、password_verify)を説明します。 MD5またはSHA1を使用してみませんか?PHPでの安全なパスワードハッシュ(例:Password_hash、password_verify)を説明します。 MD5またはSHA1を使用してみませんか?Apr 17, 2025 am 12:06 AM

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

PHP:サーバー側のスクリプト言語の紹介PHP:サーバー側のスクリプト言語の紹介Apr 16, 2025 am 12:18 AM

PHPは、動的なWeb開発およびサーバー側のアプリケーションに使用されるサーバー側のスクリプト言語です。 1.PHPは、編集を必要とせず、迅速な発展に適した解釈言語です。 2。PHPコードはHTMLに組み込まれているため、Webページの開発が簡単になりました。 3。PHPプロセスサーバー側のロジック、HTML出力を生成し、ユーザーの相互作用とデータ処理をサポートします。 4。PHPは、データベースと対話し、プロセスフォームの送信、サーバー側のタスクを実行できます。

PHPとWeb:その長期的な影響を調査しますPHPとWeb:その長期的な影響を調査しますApr 16, 2025 am 12:17 AM

PHPは過去数十年にわたってネットワークを形成しており、Web開発において重要な役割を果たし続けます。 1)PHPは1994年に発信され、MySQLとのシームレスな統合により、開発者にとって最初の選択肢となっています。 2)コア関数には、動的なコンテンツの生成とデータベースとの統合が含まれ、ウェブサイトをリアルタイムで更新し、パーソナライズされた方法で表示できるようにします。 3)PHPの幅広いアプリケーションとエコシステムは、長期的な影響を促進していますが、バージョンの更新とセキュリティの課題にも直面しています。 4)PHP7のリリースなど、近年のパフォーマンスの改善により、現代の言語と競合できるようになりました。 5)将来的には、PHPはコンテナ化やマイクロサービスなどの新しい課題に対処する必要がありますが、その柔軟性とアクティブなコミュニティにより適応性があります。

なぜPHPを使用するのですか?利点と利点が説明されましたなぜPHPを使用するのですか?利点と利点が説明されましたApr 16, 2025 am 12:16 AM

PHPの中心的な利点には、学習の容易さ、強力なWeb開発サポート、豊富なライブラリとフレームワーク、高性能とスケーラビリティ、クロスプラットフォームの互換性、費用対効果が含まれます。 1)初心者に適した学習と使用が簡単。 2)Webサーバーとの適切な統合および複数のデータベースをサポートします。 3)Laravelなどの強力なフレームワークを持っています。 4)最適化を通じて高性能を達成できます。 5)複数のオペレーティングシステムをサポートします。 6)開発コストを削減するためのオープンソース。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

Safe Exam Browser

Safe Exam Browser

Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。

AtomエディタMac版ダウンロード

AtomエディタMac版ダウンロード

最も人気のあるオープンソースエディター

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

Dreamweaver Mac版

Dreamweaver Mac版

ビジュアル Web 開発ツール