У меня есть SQL-таблица с именами пользователей и паролями. Пароли закодированы с помощью метода MessageDigest digest(). Если я закодирую пароль - допустим, "abcdef12" - методом MessageDigest digest(), а затем преобразую его в шестнадцатеричные значения, то строка будет отличаться от той, что я сделаю, используя SHA1-метод PHP. Хотя я ожидал, что эти значения будут абсолютно одинаковыми.
Код, который используется для кодирования паролей:
MessageDigest md = MessageDigest.getInstance("SHA-1");
byte[] passbyte;
passbyte = "abcdef12".getBytes("UTF-8");
passbyte = md.digest(passbyte);
Преобразование строки в шестнадцатеричное значение выполняется с помощью этого метода:
public static String convertStringToHex(String str) {
char[] chars = str.toCharArray();
StringBuffer hex = new StringBuffer();
for (int i = 0; i < chars.length; i++) {
hex.append(Integer.toHexString((int) chars[i]));
}
return hex.toString();
}
Пароль: abcdef12
Вот пароль, который возвращается многими SHA1-хэш-генераторами и PHP SHA1()-функцией: d253e3bd69ce1e7ce6074345fd5faa1a3c2e89ef
Вот пароль в кодировке MessageDigest: d253e3bd69ce1e7ce674345fd5faa1a3c2e2030ef
Am I forgetting something?
Igor.
Edit: I've found someone with a similar problem: C# SHA-1 vs. PHP SHA-1...Different Results? . Решением было изменение кодировки... но я не могу изменить кодировку на стороне сервера, поскольку пароли в этой SQL-таблице не создаются моим приложением. Я использую SHA1-кодирование на стороне клиента, используя JavaScript SHA1-класс (точнее: класс Google Web Toolkit). Он работает и кодирует строку, как и ожидалось, но, по-видимому, с использованием символов ASCII...