web-dev-qa-db-ja.com

Springセキュリティのためのソルト使用?

私は Spring security for Java Webアプリケーションを使用していて、saltなしで動作する認証プロバイダーを作成しましたが、今度はsaltを追加するか、ビルドされたSHAのように見え、XMLで指定されたソルトを使用できるSpringのセキュリティを備えたアルゴリズム。私の場合、SHAを使用しませんでしたが、 AESおよび入力パスワードは、エンコードされた暗号文字列と照合されます。例:�[�s�E�qh�% "5%��g"2T��$�`これは、このハンドラーのバックエンドと一致します。

public Authentication authenticate(Authentication authentication) throws AuthenticationException {
        String name = authentication.getName();
        String password = authentication.getCredentials().toString();
        AdministratorAccount administratorAccount = administratorAccountService.get(name);
        CryptographyProviderAES256 aes256CryptographyProvider = new CryptographyProviderAES256(256);
        byte[] mockSecretCode = new StringBuilder().append("qwertyuiqwertyui").toString().getBytes();
        byte[] encrypted = aes256CryptographyProvider.encrypt(password.getBytes(), mockSecretCode);

        //TODO: salt
        if (administratorAccount.getPassword().equals(new String(encrypted))) {
            List<GrantedAuthority> grantedAuths = new ArrayList<>();
            grantedAuths.add(new SimpleGrantedAuthority("ROLE_USER"));
            Authentication auth = new UsernamePasswordAuthenticationToken(name, password, grantedAuths);
            return auth;
        } else {
            return null;
        }
    }

代わりにSHAを使用する必要があります。これはSpringセキュリティに組み込まれており、代わりにXMLで追加できますか?アカウントクラスにパスワードとソルトの変数があります。ソルトを実装するにはどうすればよいですか?生成する必要があります次のようなアカウントを作成するときの時間+ランダムなソルト:

 final Random r = new SecureRandom();
 byte[] salt = new byte[32];
 r.nextBytes(salt);
4
Niklas

自分に有利なことをして、自分のパスワードハッシュ関数を発明しようとしないでください。一般的な暗号学の分野、特にパスワードハッシュの分野では、アマチュアの構成はほぼ常に弱いものです。これは、セキュリティをテストできないためです。どのプログラマーもsound、つまり機能するコードを作成できますが、どのプログラマーも自分が作成したコードがsecureであることを確認できません。

プロの暗号技術者も、自分で安全なアルゴリズムを発明することはできません。しかし、彼らはそれを知っている。したがって、新しいアルゴリズムを作成するときは、暗号解読を試みるために最善を尽くす仲間の暗号技術者にそれを示します。アルゴリズムが十分な時間(数)存続する場合、そのアルゴリズムは「おそらく本番環境で使用するのに十分安全」であると見なされます。

独自の暗号化チームがあり、数年待つ余裕がある場合を除いて、この処理を受けてまだ生きている既存のパスワードハッシュ関数に本当に頼る必要があります。それについて。これは基本的にbcryptまたはPBKDF2を意味します。詳細 こちら

また、password.getBytes()は使用しないでください。そのgetBytes()メソッドは、現在のロケールに依存するデフォルトの文字セットを使用します。この方法は、他の国で使用すると壊れるコードを作成するための優れた方法です。代わりに、password.getBytes("UTF-8")のように、明示的な文字セットを使用してください。

6
Tom Leek