Хэши SHA512 различаются на Android, php и javascript

Я использую хэш SHA512 для передачи некоторых зашифрованных данных между моим приложением и его серверной частью. Однако у меня странная ситуация, и я понятия не имею, что может быть причиной этого.

Итак, у меня протестированы следующие настройки:

Android 2xSHA512

Android 1x SHA512 -> CryptoJS 1x SHA512

PHP 2x SHA512

Итак, когда я делаю первое хэширование 2x Android, я получаю тот же результат, что и при хэшировании 1x android -> 1x cryptojs. Однако, когда я выполняю PHP 2x, я получаю тот же результат, что и при первом проходе Android, но второй проход шифрования PHP отличается.

На PHP я пробовал функции hash() и openssl_digest() с необработанными байтами в качестве вывода.

PHP:

$firstpass = base64_encode(hash('sha512', $enteredPassword, true));
//$firstpass = base64_encode(hash('sha512', $enteredPassword, true));

//$secondpass = base64_encode(openssl_digest($firstpass, 'sha512', true));
$secondpass = base64_encode(hash('sha512', $firstpass, true));

Андроид:

public static String encryptPassword(String password) {
    MessageDigest md = null;
    try {
        md = MessageDigest.getInstance("SHA-512");
    } catch (NoSuchAlgorithmException e) {
        e.printStackTrace();
    }
    if (md != null) {
        md.update(password.getBytes());
        byte byteData[] = md.digest();
        String base64 = Base64.encodeToString(byteData, Base64.DEFAULT);

        return base64;
    }
    return password;
}

КриптоJS:

var password = cryptojs.SHA512(req.params.password);
var basepassword = password.toString(cryptojs.enc.Base64);

Почему мой первый хеш будет правильным, а второй нет, и как я могу это исправить?


person Myth1c    schedule 18.04.2014    source источник


Ответы (1)


SHA1 не предназначен для обеспечения безопасности, не используйте его для этого. Возьмите любую реализацию BCrypt и сделайте все правильно. Что касается разных хэшей: скорее всего, проблема с кодировкой, связанная со строками.

person meredrica    schedule 18.04.2014
comment
Я просто пытаюсь выяснить, почему я не могу их сопоставить, но я также проверю BCrypt. Я обнаружил, что 2x Android и Android->CryptoJS имеют новую строку в строке base64, но версия PHP не имеет новой строки в base64: S - person Myth1c; 18.04.2014
comment
Тогда я был не так уж далек от кодирования;) - person meredrica; 18.04.2014
comment
Да, но я до сих пор понятия не имею, почему в PHP нет символов новой строки :( - person Myth1c; 18.04.2014
comment
Кодирование BASE64 иногда создает строку определенной длины и вводит новую строку. это можно отключить для каждой библиотеки. В вашем случае: Base64.encodeToString(byteData, Base64.NO_WRAP) - person meredrica; 18.04.2014
comment
Блин, это было решение!!! Я установил для Base64.DEFAULT значение Base64.NO_WRAP на Android, и проблема была решена! Огромное спасибо! - person Myth1c; 18.04.2014