0

ログインメカニズムが次のようなJSF + JPA Webアプリケーションがあります。

  1. ユーザー名は暗号化されています
  2. パスワードはハッシュ化されています
  3. 中古ジャシプト
  4. ユーザーがログインしようとすると、すべてのユーザーがループします。
  5. すべてのユーザーのユーザー名が復号化され、入力されたユーザー名と照合されます。
  6. それが一致する場合、パスワードはハッシュされ、保存されているハッシュされたパスワードと照合されます。

ユーザー数が多いことが予想される別のアプリケーションでは、別のフィールドとして保存されている最初の 3 文字からユーザーをフィルター処理します。

私が使用した準最適な方法論を指摘し、正しい行動を導くことができれば、あなたに感謝します.

暗号化に関連するコントローラがリストされます

import java.io.Serializable;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import org.jasypt.util.password.BasicPasswordEncryptor;
import org.jasypt.util.text.BasicTextEncryptor;


@ManagedBean
@SessionScoped
public class SecurityController implements Serializable {

    private static final long serialVersionUID = 1L;


public SecurityController() {
}

public String encrypt(String word) {
    BasicTextEncryptor en = new BasicTextEncryptor();
    en.setPassword("health");
    try {
        return en.encrypt(word);
    } catch (Exception ex) {
        return null;
    }
}

public String hash(String word) {
    try {
        BasicPasswordEncryptor en = new BasicPasswordEncryptor();
        return en.encryptPassword(word);
    } catch (Exception e) {
        return null;
    }
}

public boolean matchPassword(String planePassword, String encryptedPassword) {
    BasicPasswordEncryptor en = new BasicPasswordEncryptor();
    return en.checkPassword(planePassword, encryptedPassword);
}

public String decrypt(String word) {
    BasicTextEncryptor en = new BasicTextEncryptor();
    en.setPassword("health");
    try {
        return en.decrypt(word);
    } catch (Exception ex) {
        return null;
    }

    }
}

これは、私が認証をチェックする方法です。

private boolean checkUsers() {
    String temSQL;
    temSQL = "SELECT u FROM WebUser u WHERE u.retired = false";
    List<WebUser> allUsers = getFacede().findBySQL(temSQL);
    for (WebUser u : allUsers) {
        if (getSecurityController().decrypt(u.getName()).equalsIgnoreCase(userName)) {
            if (getSecurityController().matchPassword(passord, u.getWebUserPassword())) {
                setLoggedUser(u);
                setLogged(Boolean.TRUE);
                setActivated(u.isActivated());
                setRole(u.getRole());
                getMessageController().setDefLocale(u.getDefLocale());
                getMeController().createMenu();
                getWebUserBean().setLoggedUser(u);
                UtilityController.addSuccessMessage("Logged successfully");
                return true;
            }
        }
    }
    return false;
}
4

1 に答える 1

2

ユーザー名が機密性の高い場合。

  • ユーザー名を静的なソルトでハッシュします (システムには単一のソルトですが、ユーザー名を保護するには十分なはずです)
  • データベースにパスワードとともに保存される動的ソルト (ユーザーごとに個別) を使用してパスワードをハッシュします。

ユーザーがログインしようとしたとき。

  • 静的ソルトを使用してログイン時に指定されたユーザー名をハッシュし、データベースで結果を検索します。これは完全一致検索であり、単一の結果が得られます (ユーザー名が存在しない場合は何も得られません)。

  • 見つかった行から動的ソルトを取得し、それを使用してログイン時に指定されたパスワードをハッシュします。見つかったデータベース行のハッシュ化されたパスワードと一致する場合は、ユーザーを許可します。

このセキュリティを考えると、システム内のすべてのユーザー名を一覧表示できる人は誰も (あなたでさえ) ありません。ユーザー名がわかっている場合は、その存在を確認してユーザーを見つけることができます。

于 2013-07-14T18:02:31.400 に答える