Я использую Hibernate/Java для сохранения объекта в базе данных. Объект имеет поле пароль, которое представляет собой строку. При регистрации пользователя в моем приложении я хэширую пароль с помощью SHA-1 (я признаю, что это немного слабо). Это создает byte[], который я затем преобразую в String с помощью new String(byte[] arr);
Всякий раз, когда я хочу войти в систему, я просто извлекаю хешированный пароль из базы данных (как >String) и сравните его с дайджестом введенного пароля при входе в систему с помощью hashedPasswordFromDatabase.equals(SHA1_HASH(inputPassword));
Это отлично работало в моей системе разработки (Windows 7, JDK 1.6.0_23/JDK 1.7, MySQL 5.5, Tomcat 6.0.26), но после развертывания на нашем сервере (запуск JDK 1.6 в Linux) Метод equals никогда не возвращает TRUE даже для одинаковых паролей. Я быстро настроил новую систему разработки (Ubuntu 12.04, MySQL 5.5, JDK 1.7.0_03, Tomcat 7.0.22), и там тоже не работает.
Мне известны возможные проблемы с кодировкой, указанные в документации API Java для класса String, а также указанные в нескольких местах здесь, в SO. Я попробовал несколько кодировок, предложенных на этом форуме (например, Base64, Latin-1), и в итоге получил UnsupportedEncodingException. Я думаю, что мне лучше избегать преобразования String. Итак, как мне спроектировать базу данных таким образом, чтобы класс сущностей, сгенерированный Hibernate, использовал byte[] для поля password вместо String?
byte[]
напрямую должно быть простым для большей базы данных, но вы всегда можете создатьBigInteger
из массива байтов и сохранить его как числовой тип. - person erickson   schedule 15.05.2012