2017-06-13 2 views
-1

J'ai besoin d'aide pour faire une signature dans swift 3 avec HMACSHA1 pour une requête web. J'ai un exemple en Java mais je ne sais vraiment pas comment le faire dans swift.Conversion de chaîne en Base64 et HMAC sha1

Java formule:

signature = Base64.encode(HMAC_SHA1.digest(data,Base64.decode(client_secret)) 

signature = +t2GOKtZt1hU+C7OGBKZbDOKxds= 
+2

double possible de [Mise en œuvre HMAC et le chiffrement SHA1 rapide] (https://stackoverflow.com/questions/26970807/implementing-hmac-and-sha1-encryption-in-swift) – shallowThought

Répondre

0

Problème résolu

extension String { 
    func hmac(algorithm: kCCHmacAlgSHA1, key: NSData) -> String { 
     let cKey = key 
     let cData = self.cString(using: String.Encoding.ascii) 
     var cHMAC = [CC_SHA1_DIGEST_LENGTH] 
     CCHmac(CCHmacAlgorithm(kCCHmacAlgSHA1), cKey.bytes, cKey.length, cData, Int(strlen(cData!)), &cHMAC) 
     let hmacData:NSData = NSData(bytes: cHMAC, length: cHMAC) 
     let hmacBase64 = hmacData.base64EncodedString(options: NSData.Base64EncodingOptions(rawValue: 0)) 
     return String(hmacBase64) 
    } 
} 

let hmacResult: String = cData.hmac(algorithm: HMACAlgorithm.SHA1, key: keyData) 
0

Solution:

extension Data { 

    func hmacsha1(key: String) -> String? { 
     guard let keyData = Data(base64Encoded: key, options: .ignoreUnknownCharacters) else { 
      return nil 
     } 
     var digest = [UInt8](repeating: 0, count: Int(CC_SHA1_DIGEST_LENGTH)) 
     self.withUnsafeBytes({ dataBytes in 
      keyData.withUnsafeBytes({ keyDataBytes in 
       CCHmac(CCHmacAlgorithm(kCCHmacAlgSHA1), keyDataBytes, keyData.count, dataBytes, self.count, &digest) 
      }) 
     }) 
     return Data(bytes: digest).base64EncodedString() 
    } 

} 

Test:

let data = Data("Test".utf8) 
    let key = Data("Key".utf8).base64EncodedString() 
    let hmac = data.hmacsha1(key: key) 

Résultat: "xIcCRlnXa+IqFtO+9AF3OqeRdAU="

+0

Salut, quand j'utilise votre solution avec les données ' "3tme3bnmepmibhvv1toq4xfed866faaa06aa1b13979653502956"' 'et touche "0gkp7n6tnwdn816kyzfp26s3e"' i fs a 'ce « résultat = zWYYH5p8jUn6cAHjP + oB6IbOUuU = '' mais j'ai besoin 1WVoLPXcqJVKaxSK50ArFHtKtnM = '. peut-être son becouse n'est-ce pas décoder comme dans l'exemple java? 'Base64.decode (client_secret)' –

+0

Désolé, j'ai eu une faute de frappe dans mon code. J'ai utilisé 'keyData.count' deux fois dans la ligne avec' CCHmac'. J'ai adapté ma réponse en conséquence. Maintenant, tout devrait fonctionner. – sundance

+0

J'ai résolu un problème, merci pour votre aide si vous êtes intéressé J'ajoute un extrait de code –

0

rapide 3: premier c retournez l'image dans les données. Puis convertissez cette imageData en base64 string.

 imgData = UIImageJPEGRepresentation(image, 0.9)! as Data 
    strBase64 = imgData.base64EncodedString(options: .lineLength64Characters) as NSString 

puis utilisez cette chaîne base64 où vous voulez.