2015-07-01 5 views
4

Я использую Java в Eclipse и храню хешированный пароль в моей базе данных при создании нового пользователя. Это делается с помощью этого кода ..Проверка пароля Hashed из базы данных MySQL

String hashed_password = Password.hashPassword(passwordField.toString()); 
String query = "insert into user (username, password, usertype, license_code) values (?, ?, ?, ?)"; 
PreparedStatement pst = connection.prepareStatement(query); 
pst.setString(1, userNameTextField.getText()); 
pst.setString(2, hashed_password); 

я ушел из некоторых других деталей, не связанные с паролем, однако, мое Хешированное значение сохраняет в базе данных. Затем я войти в систему и сделать следующий код ...

String test_passwd = passwordField.getText(); 
String test_hash = "$2a$12$N773YstmtU/1zIUe9An.r.P9U5BQp4o6.Qjk.J.zhA6ZtFytYuOZC"; 

System.out.println("Testing BCrypt Password hashing and verification"); 
System.out.println("Test password: " + test_passwd); 
System.out.println("Test stored hash: " + test_hash); 
System.out.println("Hashing test password..."); 
System.out.println(); 

String computed_hash = Password.hashPassword(test_passwd); 
System.out.println("Test computed hash: " + computed_hash); 
System.out.println(); 
System.out.println("Verifying that hash and stored hash both match for the test password..."); 
System.out.println(); 

String compare_test = Password.checkPassword(test_passwd, test_hash) 
? "Passwords Match" : "Passwords do not match"; 
String compare_computed = Password.checkPassword(test_passwd, computed_hash) 
? "Passwords Match" : "Passwords do not match"; 

System.out.println("Verify against stored hash: " + compare_test); 
System.out.println("Verify against computed hash: " + compare_computed); 

Переменная test_hash является хэшируются пароль, который хранится в базе данных из нового кода пользователя. Когда я вхожу в систему, я знаю, что я использую тот же пароль, который я использовал в новом приглашении пользователя.

Однако, вот мои результаты:

Test stored hash: $2a$12$N773YstmtU/1zIUe9An.r.P9U5BQp4o6.Qjk.J.zhA6ZtFytYuOZC 
Hashing test password... 

Test computed hash: $2a$12$rbBleRV4gyLaY4.ZZ4fjiOrLW423TWYqKmv0ejws7mmFd2N3/eieK 

Verifying that hash and stored hash both match for the test password... 

Verify against stored hash: Passwords do not match 
Verify against computed hash: Passwords Match 

Результаты указывают на то, что пароль соответствует хэш пароля прямо здесь и сейчас, но не совпадает с хэш пароля в базе данных несмотря на то же начальный пароль ,

Вот код, где хэш пароля и проверить его ...

public class Password { 
// Define the BCrypt workload to use when generating password hashes. 10-31 is a valid value. 
private static int workload = 12; 

/** 
* This method can be used to generate a string representing an account password 
* suitable for storing in a database. It will be an OpenBSD-style crypt(3) formatted 
* hash string of length=60 
* The bcrypt workload is specified in the above static variable, a value from 10 to 31. 
* A workload of 12 is a very reasonable safe default as of 2013. 
* This automatically handles secure 128-bit salt generation and storage within the hash. 
* @param password_plaintext The account's plaintext password as provided during account creation, 
*    or when changing an account's password. 
* @return String - a string of length 60 that is the bcrypt hashed password in crypt(3) format. 
*/ 
public static String hashPassword(String password_plaintext) { 
    String salt = BCrypt.gensalt(workload); 
    String hashed_password = BCrypt.hashpw(password_plaintext, salt); 

    return(hashed_password); 
} 

/** 
* This method can be used to verify a computed hash from a plaintext (e.g. during a login 
* request) with that of a stored hash from a database. The password hash from the database 
* must be passed as the second variable. 
* @param password_plaintext The account's plaintext password, as provided during a login request 
* @param stored_hash The account's stored password hash, retrieved from the authorization database 
* @return boolean - true if the password matches the password of the stored hash, false otherwise 
*/ 
public static boolean checkPassword(String password_plaintext, String stored_hash) { 
    boolean password_verified = false; 

    if(null == stored_hash || !stored_hash.startsWith("$2a$")) 
     throw new java.lang.IllegalArgumentException("Invalid hash provided for comparison"); 

    password_verified = BCrypt.checkpw(password_plaintext, stored_hash); 

    return(password_verified); 
} 

}

ответ

1

Я не знаком с Java, но мне кажется, что вы получили значение из поля ввода пароля неправильный путь, может быть, вы должны проверить это:

// In the registration form 
passwordField.toString() 

// In the login form 
passwordField.getText() 
+0

Я использовал GetText() для обе части и теперь это работает! спасибо – drake

0

Я подозреваю, что вы вносите ошибку в хэш либо при хранении его в базе данных или извлечения это или оба.

Попробуйте сохранить хэш в базе данных и получить его не программно, чтобы сравнить его с хэшем, который вы создали. Если они идентичны, попробуйте извлечь их программным способом и сравнить их, чтобы увидеть, была ли введена какая-либо ошибка.