[iOS] sécurité: keychain + encryption

mercredi 13 juillet 2016
Keychain

Dans iOs chaque application à son propre keychain ou seulement l’application a accès.
Donc elle n’est pas accessible par une tierce partie.
Un keychain est un container crypter pour sauver les mots de passe et autre données sensibles.
Il faut bien garder à l’esprit que le keychain ne peut stocker que de petite partie de donnée.
Sous iOs on peut utiliser le keychain au travers de Keychain Services API.

  • SecItemAdd => cette fonction permet de rajouter un item dans le keychain de l’application.
  • SecItemCopyMatching = > pour trouver l’item depuis l’application.
  • SecItemDelete => permet de retire un item de la keychain.
  • SecItemUpdate => update de l’item
Chaque fonction accepte un item de type CFDictionaryRef qui contient la clé/valeur de l’item.

Introduction Encryption/Decryption

Il existe deux type d’encryption:
Symmetric et asymmetric

Symmetric => basé sur une même clé pour chiffrer et déchiffrer un message. le seul inconvénient est que cette clé doit bien évidemment être confidentielle et doit être transmise au correspondant de façon sure. cette mise en oeuvre peut être difficile dans le cas ou on a un grand nombre d’intervenant car il faut autant de clé que d’intervenant. Exemple de chiffrement: DES/3DES/AES

Asymmetric => Elle se base sur deux clés

  • une publique permettant le chiffrement
  • une privée permettant de déchiffrement.

Donc la clé publique est mise à la disposition de quiconque qui désire chiffrer un message et celui-ci ne pourra être déchiffrer que par la clé privée qui elle doit rester confidentielle.
Exemple de chiffrement: RSA,DSA.
Inconvénient du chiffrement RSA est sa lenteur, 1000 fois plus lent que le chiffrement DES.
la cryptographie asymétrique est également utilisée pour assurer l’authenticité d’un message.
L’empreinte du message est chiffrée à l’aide de la clé privée et est jointe au message.

Il existe aussi les fonctions de hachage qui convertit un grand ensemble en un plus petit ensemble, l’empreinte.
Il est impossible de la déchiffrer pour revenir à l’ensemble d’origine, ce n’est donc pas une technique de chiffrement.
Car pour rappele le chiffrement est une transformation à l’aide d’une clé d’un message en clair en un message incompréhensible pour celui qui ne dispose pas de la clé de déchiffrement.
Exemple: MD5, SHA-1, SHA-256

Donc en résumé le chiffrement symétrique utile une clé commune partagée pour crypter et décrypter un message.
Tandis qu’un chiffrement asymétrique utilise une clé pour chiffrer le message et une pour le déchiffrer.

Dans IOS

Ajouter les frameworks suivants:
MobileCoreServices.framework
Security.framework

pods:

On peut utilise un keychainwrapper pour s’occuper de la gestion du keychain (SSkeychain,ou KeychainWrapper).
Et elle se base sur le framework de security d’Apple.
Il existe aussi deux types d’attributs de sécurité Unlock ou FirstUnlock.
La première est beaucoup plus sécurisé car elle permet d’avoir accès au keychain uniquement quand l’application
est active. Donc quand l’application passe en background ou on quitte l’application le keychain n’est plus accessible.
Dans l’autre cas il est toujours accessible jusqu’à extinction du téléphone.

RNCryptor

Librairie pour crypter / décrypter des données

let randomKey : NSData = RNCryptor.randomDataOfLength(32)
let secretKey : String = randomKey.base64EncodedStringWithOptions(.Encoding64CharacterLineLength)

Permet de créer une donnée aléatoire, qui pourra être la clé partagée utilisée pour chiffrer vos données sensibles.
Idéale est bien sur de sauver cette clé dans le Keychain du téléphone.

let valueEncrypt = RNCryptor.encryptData(data, password: secretKey)

Permet de chiffrer data au travers de secretKey qu’on aura récupéré du keychain. Ensuite, il reste plus que de mettre cette donnée dans le keychain aussi.

do {
	let originalData = try RNCryptor.decryptData(valueEncrypt, password: secretKey)
    let value : String = String(data: originalData, encoding: NSUTF8StringEncoding)!
    return value
} catch {
	print(error)
	return nil
}

Permet de déchiffrer la valeur encrypter qu’on aura récupérer auparavant du keychain en utilisant la clé partagée qui elle aussi était sauvé dans le keychain.

Tags: keychain , sécurité , Swift