Недопустимая ревизия соли при сравнении сгенерированного Python хэша с необработанным паролем в Java
Итак, я создал базу данных, в которой хранится информация о пользователях и их хэшированные пароли, которые хэшируются с использованием скрипта Python с использованием bcrypt
модуль.
Теперь для входа с помощью моего Java-клиента я использую JBCrypt
библиотека включена в качестве зависимости Maven в моем проекте IntelliJ. Он извлекает хеш, и соединение с базой данных работает отлично, единственная проблема в том, что он выдает эту ошибку:
Exception in thread "AWT-EventQueue-0" java.lang.IllegalArgumentException: Invalid salt revision
at org.mindrot.jbcrypt.BCrypt.hashpw(BCrypt.java:671)
at org.mindrot.jbcrypt.BCrypt.checkpw(BCrypt.java:763)
at mypackage.Login.validateUser(Login.java:81)
at mypackage.Login.actionPerformed(Login.java:63)
at java.desktop/javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1967)
at java.desktop/javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2308)
at java.desktop/javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:405)
at java.desktop/javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:262)
at java.desktop/javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:269)
at java.desktop/java.awt.Component.processMouseEvent(Component.java:6578)
at java.desktop/javax.swing.JComponent.processMouseEvent(JComponent.java:3343)
at java.desktop/java.awt.Component.processEvent(Component.java:6343)
at java.desktop/java.awt.Container.processEvent(Container.java:2259)
at java.desktop/java.awt.Component.dispatchEventImpl(Component.java:4961)
at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2317)
at java.desktop/java.awt.Component.dispatchEvent(Component.java:4793)
at java.desktop/java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4904)
at java.desktop/java.awt.LightweightDispatcher.processMouseEvent(Container.java:4539)
at java.desktop/java.awt.LightweightDispatcher.dispatchEvent(Container.java:4480)
at java.desktop/java.awt.Container.dispatchEventImpl(Container.java:2303)
at java.desktop/java.awt.Window.dispatchEventImpl(Window.java:2758)
at java.desktop/java.awt.Component.dispatchEvent(Component.java:4793)
at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:766)
at java.desktop/java.awt.EventQueue.access$500(EventQueue.java:97)
at java.desktop/java.awt.EventQueue$3.run(EventQueue.java:717)
at java.desktop/java.awt.EventQueue$3.run(EventQueue.java:711)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:89)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:99)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:739)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:737)
at java.base/java.security.AccessController.doPrivileged(Native Method)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:89)
at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:736)
at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:199)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
Код для проверки выглядит следующим образом:
String dbHash = results.getString("password");
System.out.println(dbHash);
boolean result = BCrypt.checkpw(new String(passwordField.getPassword()), dbHash);
РЕДАКТИРОВАТЬ: Пример хэшированного пароля и необработанного пароля из скрипта модуля Python выглядит следующим образом:
Raw: zO/15;w|c'*uftH)
Hashed: $2b$12$7Y4ZmORuoH0dziYSg8dpd.PfvWQx2QPcoiRoGWg.HKfhuN6evEZnO
** РЕДАКТИРОВАТЬ: ** Я заметил, что это потому, что JBCrypt, кажется, не поддерживает ничего большего, чем $2a
хэши. Я не могу найти bcrypt
модуль документации для Python, поэтому я не могу определить, могу ли я использовать $2a
хэш в коде Python.
2 ответа
Проблема была проблема с JBCrypt
, Устаревший (может проверить только $2a
хэши.
Поэтому, чтобы исправить это, мне пришлось изменить скрипт Python, чтобы генерировать соль, которая использует $2a
префикс:
Регулируемый префикс
Еще одна особенность bcrypt - это настраиваемый префикс, позволяющий вам определять, с какими библиотеками вы будете поддерживать совместимость. Чтобы настроить это, передайте 2a или 2b (по умолчанию) bcrypt.gensalt(prefix=b"2b") в качестве объекта байтов.
Судя по исходному коду, исключение исходит из проверки формата хешированного пароля:
if (salt.charAt(0) != '$' || salt.charAt(1) != '2')
throw new IllegalArgumentException ("Invalid salt version");
if (salt.charAt(2) == '$')
off = 3;
else {
minor = salt.charAt(2);
if (minor != 'a' || salt.charAt(3) != '$')
throw new IllegalArgumentException ("Invalid salt revision");
off = 4;
}
Так что я думаю, что dbHash
по какой-то причине не соответствует формату. Либо это генерируется несовместимой версией. Или это на самом деле не хэшируется. Или пусто.