Cet article fait suite à : Own crypto app .Net Only

Nous allons modifier notre projet en vue du remplacement des primitives cryptographiques .NET par celles fournies par les librairies externes Bouncy Castle et SharpHash.

Bouncy Castle

Nous utiliserons principalement Bouncy Castle pour l’utilisation des primitives cryptographiques. Le projet est réputé sûr et il est open source. Avec BouncyCastle, nous pouvons utiliser AES en mode CTR plutôt que CBC. Je préfère ce mode pour plusieurs raisons. Il se rapproche du sacro saint one time password, la lecture et l’écriture peuvent être parallélisables, l’accès en lecture peut être direct, i.e. on peut déchiffrer une partie du fichier sans avoir lu les octets précédents. Ce mode n’existe pas en .NET. Avec Bouncy Castle, je peux facilement diversifier les algorithmes utilisés sans tout redévelopper.

IBlockCipher engine = new SicBlockCipher(new AesEngine()); // on instancie un mode avec un algorithme de crypto particulier

// on spécifie les paramètres pour la crypto
KeyParameter kp = new KeyParameter(key);
ParametersWithIV kpvi = new ParametersWithIV(kp, iv);

engine.Init(false, kpvi);

// Class concrète implémentant ICryptoTransform
Cipher = new BufferedBouncyCastleCryptoTransform(engine);

Dans le code précédent, en changeant simplement le paramètre du constructeur de SicBlockCipher, je pourrais utiliser Blowfish, Threefish, …, toutes les classes implémentant IBlockCipher, BouncyCastle engines. L’utilisation d’interface facilite grandement l’interchangeabilité entre les différentes classes concrètes des moteurs de crypto. A noter que j’utilise aussi l’interface ICryptoTransform de .Net pour la simplification d’utilisation avec les Streams.

Pour ajouter une difficulté supplémentaire aux éventuels attaquants, j’utilise un autre type d’algorithme de crypto pour chiffrer la clé XSalsa20. Précision, je ne fais pas de ‘sur chiffrement’, style poupée russe, voir TripleSec. Je ne considère pas ce genre de construction comme plus fort. Dans notre cas, j’utilise XSalsa20 pour chiffrer des données aléatoires, en gros la clé, qui sera utile pour déchiffrer le fichier qui est chiffré par AES.

Mon idée est de réduire au maximum les failles, les erreurs de conception, sans rendre l’ensemble rigide et lié à un seul algo. Pour moi, tout algo de crypto est sûr si on n’a pas prouvé le contraire.

SharpHash

SharpHash sera utilisé dans un premier temps pour son implémentation de Argon2. Argon2 définit des fonctions d’étirement de mot de passe. Comme évoqué précédemment, un mot de passe fourni par un être humain est faible. Pour le rendre plus acceptable au niveau de la sécurité, on utilise des fonctions d’étirements. Avec .NET, seule la méthode PBKDF2 est implémentée dans sa version Rfc2898. Elle est maintenant considérée comme faible. Suite au concours PHC, Argon2 est sorti vainqueur devant Catena, Lyra2, Makwa, yescrypt. Malheureusement, dans le monde .NET, toutes ces nouveautés ne sont pas encore directement accessibles. Grâce à SharpHash nous avons une implémentation C# de Argon2, ici Argon2id une combinaison des deux variantes Argon2i et Argon2d, offrant une protection plus large. La prise en main est relativement simple, seule la configuration demande un tâtonnement. vous trouverez quelques infos ici et ici.

Je vous laisse parcourir le code et les tests pour vous faire un avis. L’utilisation des deux librairies ne posent pas de problème en soi. Elles sont simples à prendre en main.

Bilan

Nous avons fait le choix jusqu’ici de nous concentrer sur la confidentialité des données. La gestion de l’intégrité et de l’authentification sera abordée dans le prochain article.