Я пытаюсь хешировать строку в Swift 3 (и/или объектив C), используя ripemd160
для эмуляции вывода следующего php:
$string = 'string';
$key = 'test';
hash_hmac('ripemd160', $string, $key);
// outputs: 37241f2513c60ae4d9b3b8d0d30517445f451fa5
Пока:
Я попытался изучить функциональность hash_hmac
, которую я могу найти, например:
Быстрое внедрение шифрования HMAC и SHA1
enum HMACAlgorithm {
case MD5, SHA1, SHA224, SHA256, SHA384, SHA512, RIPEMD160
func toCCHmacAlgorithm() -> CCHmacAlgorithm {
var result: Int = 0
switch self {
case .MD5:
result = kCCHmacAlgMD5
case .SHA1:
result = kCCHmacAlgSHA1
case .SHA224:
result = kCCHmacAlgSHA224
case .SHA256:
result = kCCHmacAlgSHA256
case .SHA384:
result = kCCHmacAlgSHA384
case .SHA512:
result = kCCHmacAlgSHA512
case .RIPEMD160:
result = kCCHmacAlgRIPEMD160
}
return CCHmacAlgorithm(result)
}
func digestLength() -> Int {
var result: CInt = 0
switch self {
case .MD5:
result = CC_MD5_DIGEST_LENGTH
case .SHA1:
result = CC_SHA1_DIGEST_LENGTH
case .SHA224:
result = CC_SHA224_DIGEST_LENGTH
case .SHA256:
result = CC_SHA256_DIGEST_LENGTH
case .SHA384:
result = CC_SHA384_DIGEST_LENGTH
case .SHA512:
result = CC_SHA512_DIGEST_LENGTH
}
return Int(result)
}
}
extension String {
func hmac(algorithm: HMACAlgorithm, key: String) -> String {
let cKey = key.cString(using: String.Encoding.utf8)
let cData = self.cString(using: String.Encoding.utf8)
var result = [CUnsignedChar](repeating: 0, count: Int(algorithm.digestLength()))
CCHmac(algorithm.toCCHmacAlgorithm(), cKey!, Int(strlen(cKey!)), cData!, Int(strlen(cData!)), &result)
let hmacData:NSData = NSData(bytes: result, length: (Int(algorithm.digestLength())))
let hmacBase64 = hmacData.base64EncodedString(options: NSData.Base64EncodingOptions.lineLength76Characters)
return String(hmacBase64)
}
}
и реализовать:
let hmacResult: String = "myStringToHMAC".hmac(algorithm: HMACAlgorithm.SHA1, key: "foo")
Это позволяет мне успешно хэш строку с использованием hmac и один из алгоритмов шифрования, предоставляемых <CommonCrypto/CommonHMAC.h>
Вопрос
Проблема в том, что библиотека не поддерживает ripemd160
, поэтому как я могу добавить эту поддержку, чтобы выполнить то, что мне нужно?
Вопрос точно такой же, как этот, но в Java здесь, вы можете видеть, как это было решено и что именно я ищу, но на этот раз с помощью Swift 3:
Hash строка в Java, эмулирующая php-функцию hash_hmac, используя ripemd160 с ключом