package club.wpia.gigi.util;
-import java.io.UnsupportedEncodingException;
-import java.security.MessageDigest;
-import java.security.NoSuchAlgorithmException;
import java.util.Properties;
import com.lambdaworks.crypto.SCryptUtil;
if (password == null || password.isEmpty()) {
return null;
}
+
if (hash.contains("$")) {
if (SCryptUtil.check(password, hash)) {
return hash;
return null;
}
}
- String newhash = sha1(password);
- boolean match = true;
- if (newhash.length() != hash.length()) {
- match = false;
- }
- for (int i = 0; i < newhash.length(); i++) {
- match &= newhash.charAt(i) == hash.charAt(i);
- }
- if (match) {
- return hash(password);
- } else {
- return null;
- }
- }
- public static String sha1(String password) {
- try {
- MessageDigest md = MessageDigest.getInstance("SHA1");
- byte[] digest = md.digest(password.getBytes("UTF-8"));
- StringBuffer res = new StringBuffer(digest.length * 2);
- for (int i = 0; i < digest.length; i++) {
- res.append(Integer.toHexString((digest[i] & 0xF0) >> 4));
- res.append(Integer.toHexString(digest[i] & 0xF));
- }
- return res.toString();
- } catch (NoSuchAlgorithmException e) {
- throw new Error(e);
- } catch (UnsupportedEncodingException e) {
- throw new Error(e);
- }
+ return null;
}
public static String hash(String password) {
import club.wpia.gigi.database.GigiResultSet;
import club.wpia.gigi.testUtils.ManagedTest;
import club.wpia.gigi.testUtils.RegisteredUser;
-import club.wpia.gigi.util.PasswordHash;
public class TestPasswordMigration extends ManagedTest {
@Rule
public RegisteredUser ru = new RegisteredUser();
+ /**
+ * Gigi used to support plain SHA-1 password hashes, for compatibility with
+ * legacy software. Since there currently is only one accepted hash format,
+ * this test now verifies that plain SHA-1 hashes are no longer accepted nor
+ * migrated to more recent hash formats.
+ *
+ * @see PasswordHash.verifyHash
+ * @see PasswordHash.hash
+ * @throws IOException
+ */
@Test
- public void testPasswordMigration() throws IOException {
+ public void testNoSHA1PasswordMigration() throws IOException {
try (GigiPreparedStatement stmt = new GigiPreparedStatement("UPDATE users SET `password`=? WHERE id=?")) {
- stmt.setString(1, PasswordHash.sha1("a"));
+ stmt.setString(1, "86f7e437faa5a7fce15d1ddcb9eaeaea377667b8"); // sha1("a")
stmt.setInt(2, ru.getUser().getId());
stmt.execute();
}
+
String cookie = login(ru.getUser().getEmail(), "a");
- assertTrue(isLoggedin(cookie));
+ assertFalse(isLoggedin(cookie));
try (GigiPreparedStatement stmt = new GigiPreparedStatement("SELECT `password` FROM users WHERE id=?")) {
stmt.setInt(1, ru.getUser().getId());
GigiResultSet res = stmt.executeQuery();
assertTrue(res.next());
String newHash = res.getString(1);
- assertThat(newHash, containsString("$"));
+ assertThat(newHash, not(containsString("$")));
}
}
}