fix: Remove deprecated cryptography no longer needed for backward compat
authorBenny Baumann <BenBE1987@gmx.net>
Sun, 19 Mar 2017 17:25:21 +0000 (18:25 +0100)
committerBenny Baumann <BenBE1987@gmx.net>
Wed, 22 Mar 2017 18:22:07 +0000 (19:22 +0100)
Change-Id: I313eb549647a374f1740d6b0bea1b6e818dd68ed

src/club/wpia/gigi/util/PasswordHash.java
tests/club/wpia/gigi/util/TestPasswordMigration.java

index 51dffb70d8ed0763548ce7be6fed104364682c30..7d2cb3342e92b0d4f6921c54b2191ce783c6083e 100644 (file)
@@ -1,8 +1,5 @@
 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;
@@ -29,6 +26,7 @@ public class PasswordHash {
         if (password == null || password.isEmpty()) {
             return null;
         }
+
         if (hash.contains("$")) {
             if (SCryptUtil.check(password, hash)) {
                 return hash;
@@ -36,36 +34,8 @@ public class PasswordHash {
                 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) {
index 17544a0bdc610737aa0af8be9771f3c5f2de614d..1ad8ae8a04a55ad829a1f8b78bc7509a35dc0575 100644 (file)
@@ -12,29 +12,39 @@ import club.wpia.gigi.database.GigiPreparedStatement;
 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("$")));
         }
     }
 }