Я обнаружил ОГРОМНУЮ проблему в своем коде, и я буквально понятия не имею, что вызывает это.
ТАК, когда я отправляю запросы на мой сервер, я хэширую строку, которая есть в запросе.Иногда это ввод пользователя.
Мое приложение мультиязычное, поэтому я должен поддерживать все символы "ä" и т. Д.
Так что с обычными английскими буквами / цифрами и т. Д. Этот метод хеширования работаеткак мечта.НО, когда строка, которая хэшируется и сравнивается, содержит «ä» или «ö» (не особенно те, что буквально может быть, что любой символ, не входящий в набор Base64, вызовет это), хэш не совпадает!
Это абсолютная и полная катастрофа, и я не заметил этого до сих пор.Я попробовал в основном все, что я знаю, чтобы попытаться исправить это, и поиск в Google, и мне пока не повезло.
Я генерирую хэш в Swift, вводя строку и secretToken в эту функцию и сохраняя вывод какзаголовок HTTP:
func hmac(string: String, key: String) -> String {
var digest = [UInt8](repeating: 0, count: Int(CC_SHA256_DIGEST_LENGTH))
CCHmac(CCHmacAlgorithm(kCCHmacAlgSHA256), key, key.count, string, string.count, &digest)
let data = Data(digest)
return data.map { String(format: "%02hhx", $0) }.joined()
}
Как сравнить хеш в NodeJS:
if (hashInTheRequest === crypto.createHmac('sha256', secretToken).update(stringToHash).digest('hex')) {
//Good to go
}
Заранее спасибо!