「労働者が自分の仕事をうまくやりたいなら、まず自分の道具を研ぎ澄まさなければなりません。」 - 孔子、「論語。陸霊公」
表紙 > プログラミング > データベースにユーザーパスワードを安全に保存します

データベースにユーザーパスワードを安全に保存します

2025-04-19に投稿されました
ブラウズ:527

1.パスワードセキュリティの重要性を理解する

セキュリティ侵害はこれまで以上に一般的であり、パスワードは多くの場合、チェーンで最も弱いリンクです。攻撃者は、パスワードをクラックするために、ブルートフォース攻撃、辞書攻撃、その他の方法を頻繁に使用します。したがって、パスワードが安全に保存されていることを確認し、簡単に侵害することはできません。

Secure User Passwords in a Database

1.1パスワードセキュリティの低いリスク

パスワードセキュリティの低下は、データ侵害、個人情報の盗難、および重大な財政的損失につながる可能性があります。パスワードを平易なテキストに保存し、弱いハッシュアルゴリズムを使用している、または適切なアクセス制御を実装していないことは、壊滅的な結果につながる可能性のある一般的な間違いの一部です。

1.2パスワードセキュリティにおけるハッシュの役割

ハッシュは、パスワードを固定長の文字列の文字列に変換するプロセスであり、エンジニアリングを逆転させることはほとんど不可能です。優れたハッシュ関数は、計算、決定論的、不可逆性、さまざまな入力に対して一意の出力を生成するために高速でなければなりません。

2。ユーザーパスワードを保護する手法

データベース内のユーザーパスワードを保護するためのいくつかの堅牢な手法があります。次のセクションでは、コードの例、デモ、結果とともに、これらの手法を詳細に説明します。

2.1ハッシュ前のパスワードを塩漬け

Secure User Passwords in a Database

塩分は、ハッシュする前にパスワードにランダムデータを追加するプロセスです。この手法により、2人のユーザーが同じパスワードを持っていても、ハッシュされた値が異なることが保証され、攻撃者が攻撃に事前計算されたハッシュテーブル(レインボーテーブル)を使用することがより困難になります。

Javaでの塩漬けとハッシュの例の例:

import java.security.SecureRandom;
import java.security.MessageDigest;
import java.util.Base64;

public class PasswordSecurity {
    private static final String SALT_ALGORITHM = "SHA1PRNG";
    private static final String HASH_ALGORITHM = "SHA-256";

    public static String generateSalt() throws Exception {
        SecureRandom sr = SecureRandom.getInstance(SALT_ALGORITHM);
        byte[] salt = new byte[16];
        sr.nextBytes(salt);
        return Base64.getEncoder().encodeToString(salt);
    }

    public static String hashPassword(String password, String salt) throws Exception {
        MessageDigest md = MessageDigest.getInstance(HASH_ALGORITHM);
        md.update(salt.getBytes());
        byte[] hashedPassword = md.digest(password.getBytes());
        return Base64.getEncoder().encodeToString(hashedPassword);
    }

    public static void main(String[] args) throws Exception {
        String salt = generateSalt();
        String hashedPassword = hashPassword("mySecurePassword123", salt);
        System.out.println("Salt: "   salt);
        System.out.println("Hashed Password: "   hashedPassword);
    }
}

出力は、一意の塩とハッシュされたパスワードを示しているため、同じパスワードでさえ異なる塩のために異なるハッシュがあることを明らかにしています。

2.2適応ハッシュアルゴリズムの使用(Bcrypt、Scrypt、Argon2)

Secure User Passwords in a Database

Bcrypt、Scrypt、Argon2などの最新のハッシュアルゴリズムは、計算的に集中的になるように特別に設計されているため、ブルートフォース攻撃に耐性があります。これらのアルゴリズムは、キーストレッチングなどの手法を使用し、時間の経過とともに複雑さを高めるために調整可能です。

JavaでBcryptを使用した例コード:

import org.mindrot.jbcrypt.BCrypt;

public class BCryptExample {
    public static String hashPassword(String plainPassword) {
        return BCrypt.hashpw(plainPassword, BCrypt.gensalt(12));
    }

    public static boolean checkPassword(String plainPassword, String hashedPassword) {
        return BCrypt.checkpw(plainPassword, hashedPassword);
    }

    public static void main(String[] args) {
        String hashed = hashPassword("mySecurePassword123");
        System.out.println("Hashed Password: "   hashed);

        boolean isMatch = checkPassword("mySecurePassword123", hashed);
        System.out.println("Password Match: "   isMatch);
    }
}

ハッシュされたパスワードが表示され、パスワード検証が成功し、パスワードハッシュのBCRYPTのセキュリティと有効性を示します。

2.3ペッパー:セキュリティの追加層

Secure User Passwords in a Database

ペッパーでは、ハッシュする前にパスワードに秘密キー(ペッパーとして知られている)を追加することを伴います。コショウは、通常はアプリケーションコードまたは環境変数にハッシュされたパスワードと塩とは別に保管され、セキュリティの追加層を追加します。

実装戦略:

  • 安全なランダムジェネレーターを使用してペッパーキーを生成します。
  • ハッシュする前に、コショウを塩漬けパスワードに追加します。

2.4レートの制限およびアカウントロックアウトメカニズムの実装

強いハッシュと塩漬けがあっても、ブルートフォースの攻撃は脅威のままです。レートの制限(例:ログイン試行の数を制限する)とアカウントロックアウトメカニズムを実装すると、これらのリスクを軽減するのに役立ちます。

javaのアカウントロックアウトの例の例:

import java.util.HashMap;
import java.util.Map;

public class AccountSecurity {
    private static final int MAX_ATTEMPTS = 5;
    private Map loginAttempts = new HashMap();

    public boolean isAccountLocked(String username) {
        return loginAttempts.getOrDefault(username, 0) >= MAX_ATTEMPTS;
    }

    public void recordFailedAttempt(String username) {
        int attempts = loginAttempts.getOrDefault(username, 0)   1;
        loginAttempts.put(username, attempts);
    }

    public void resetAttempts(String username) {
        loginAttempts.put(username, 0);
    }
}

3。パスワードを保護するためのベストプラクティス

堅牢なセキュリティを確保するために、これらのベストプラクティスに従ってください:

強力でユニークな塩とペッパーを使用します

ソルトは、パスワードエントリごとに一意であり、安全な乱数ジェネレーターを使用して生成する必要があります。コショウは安全に保管し、ソースコードにハードコーディングしないでください。

ハッシュアルゴリズム

を定期的に更新する

ハッシュアルゴリズムの進歩を最新の状態に保ち、必要に応じて新しい攻撃ベクトルを保護するために実装を調整します。

Multi-Factor Authentication(MFA)

を実装する

強力なパスワードセキュリティは重要ですが、MFAを実装すると、ユーザーが複数の形式の検証を提供するよう要求することにより、セキュリティの追加レイヤーを追加します。

4。結論

データベースでのユーザーパスワードの保護は、万能タスクではありません。堅牢なセキュリティを確保するために、テクニックとプラクティスの組み合わせが必要です。塩漬けを実装し、適応ハッシュアルゴリズムを使用し、ペッパーを使用し、レートの制限とアカウントロックアウトメカニズムを設定することにより、開発者は保存されたユーザーパスワードのセキュリティを大幅に強化できます。

もっと知りたいですか、それとも質問がありますか?以下にコメントしてください!

詳細を読む:データベースのユーザーパスワードを保護します

リリースステートメント この記事は、https://dev.to/anh_trntun_4732cf3d299/secure-user-passwords-in-a-database-51do?1に再現されています。
最新のチュートリアル もっと>

免責事項: 提供されるすべてのリソースの一部はインターネットからのものです。お客様の著作権またはその他の権利および利益の侵害がある場合は、詳細な理由を説明し、著作権または権利および利益の証拠を提出して、電子メール [email protected] に送信してください。 できるだけ早く対応させていただきます。

Copyright© 2022 湘ICP备2022001581号-3