目次
0×00 はじめに
0×01 PHP
PHP 最初の選択肢
PHP の 2 番目のオプション
0×02 JAVA
JAVA の最初のソリューション
JAVA 2 番目のオプション
0×03 C# .NET
C# (.NET) 最初のオプション
C# (.NET) の 2 番目の解決策
0×04 Ruby
Ruby の 1 番目の解決策
rubyのscrpytハッシュリングRuby bcrypt Python パッケージ (GitHub)
Python 第二种方案
0×06 Node.js
Node.js 第一种方案
Node.js 第二种方案
ホームページ バックエンド開発 PHPチュートリアル 開発者セキュリティ ガイド: ユーザー パスワードを安全に保存する方法

開発者セキュリティ ガイド: ユーザー パスワードを安全に保存する方法

Jun 23, 2016 pm 01:16 PM

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 までご連絡ください。

ホット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衣類リムーバー

Video Face Swap

Video Face Swap

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

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

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とPython:2つの一般的なプログラミング言語を比較します PHPとPython:2つの一般的なプログラミング言語を比較します Apr 14, 2025 am 12:13 AM

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

アクション中のPHP:実際の例とアプリケーション アクション中のPHP:実際の例とアプリケーション Apr 14, 2025 am 12:19 AM

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

PHP:Web開発の重要な言語 PHP:Web開発の重要な言語 Apr 13, 2025 am 12:08 AM

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

PHPの永続的な関連性:それはまだ生きていますか? PHPの永続的な関連性:それはまだ生きていますか? Apr 14, 2025 am 12:12 AM

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

スカラータイプ、リターンタイプ、ユニオンタイプ、ヌル可能なタイプなど、PHPタイプのヒントはどのように機能しますか? スカラータイプ、リターンタイプ、ユニオンタイプ、ヌル可能なタイプなど、PHPタイプのヒントはどのように機能しますか? Apr 17, 2025 am 12:25 AM

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

PHPおよびPython:コードの例と比較 PHPおよびPython:コードの例と比較 Apr 15, 2025 am 12:07 AM

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

PHP対その他の言語:比較 PHP対その他の言語:比較 Apr 13, 2025 am 12:19 AM

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

See all articles