SHA-256 Хеширование с секретным ключом swift - PullRequest
0 голосов
/ 20 сентября 2018

Я новичок в алгоритмах шифрования и хэширования.Мне нужно хешировать строку с секретным ключом, используя алгоритм SHA-256.Я перепробовал несколько ссылок из переполнения стека, а также некоторые другие учебные пособия. Используя эти ссылки, вывод, полученный в iOS, отличается от вывода, получаемого в Android.Я использовал одну и ту же строку и секретный ключ на обеих платформах.

Фрагмент кода Android -

MessageDigest digest = MessageDigest.getInstance("SHA-256");
digest.update(secret_key);
byte[] channelKeyLong = digest.digest(message.getBytes("utf-8"));

INPUT -

secret_key = "35285324354d562c245b031232115124372e5242394f51301f62224e1e432910"
message = "Guest"

OUTPUT = "99D71664BD5A35E0185C020BACB709DEB24A81555E275CA9328F8CB4E6F186C3 "

IOS код snipet -

extension String {
  func generateSHA256(key: String) -> String {
        var digest = [UInt8](repeating: 0, count: Int(CC_SHA256_DIGEST_LENGTH))
        CCHmac(CCHmacAlgorithm(kCCHmacAlgSHA256), key, key.count, self, self.count, &digest)
        let data = Data(bytes: digest)
        return data.map { String(format: "%02hhx", $0) }.joined()
    }
}

ВХОД -

secret_key = "35285324354d562c245b031232115124372e5242394f51301f62224e1e432910"
message = "Guest"

РЕАЛИЗАЦИЯ -> OUTPUT = message.generateSHA256 (secret_key)

`OUTPUT = "944a37b9768970c5da4f35295008470603391223a05d2b17eed668f1678d447c"'

Пожалуйста, предложите любой другой метод, который я могу реализовать в iOS, чтобы получить тот же вывод, что и полученный в Android.

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018

Ваш код Android и ваш код iOS не эквивалентны.

Ваш код Android просто вычисляет дайджест SHA256 для конкатенации значения ключа с вашим сообщением.

Сначала вы звоните update с вашим ключом, а затем звоните digest с вашим сообщением.В документации говорится:

Выполняет окончательное обновление дайджеста с использованием указанного массива байтов, а затем завершает вычисление дайджеста.То есть этот метод сначала вызывает update(input), передавая входной массив методу обновления, затем вызывает digest().

С другой стороны, ваш код iOS вычисляет HMAC вашегосообщение с использованием предоставленного ключа.Это не одно и то же.

Вам необходимо вычислить SHA256 так же, как вы делаете это на Android;

  • Используйте CC_SHA256_Init
  • , звоните CC_SHA256_Update с вашим ключом и сообщением
  • Позвоните CC_SHA256_Final, чтобы получить хеш

Вероятно, в Swift проще использовать SwiftyRSA .Все, что вам нужно сделать, это создать экземпляр ClearMessage, инициализированный вашим ключом конкатенации и сообщением, а затем вызвать для него функцию дайджеста.

0 голосов
/ 20 сентября 2018

Не знаю, как андроид делает SHA-256, но для iOS я могу сказать, что код, который вы делаете, идеален, и результаты верны.Вы должны обновить свой вопрос: «Как я могу получить» SHA-256 для Android так же, как iOS »

Вы можете проверить SHA-256 HashMap онлайн здесь

Просто введите ввод и секретный ключ и выберите SHA-256 из списка.

secret_key = "35285324354d562c245b031232115124372e5242394f51301f62224e1e432910"
message = "Guest"

Вы увидите вывод, который совпадает с выводом, полученным из кода iOS в вашем вопросе.

944a37b9768970c5da4f35295008470603391223a05d2b17eed668f1678d447c

Надеюсь, это поможет!

...