Chiffrer / déchiffrer très facilement des données avec la classe MachineKey en .Net 4.5

icon Tags de l'article : ,

Mai 17, 2018
Salut à tous,

Aujourd'hui on va parler chiffrement. Et depuis .Net 4.5, c'est fichtrement simple (je vous épargnerai l'historique complet du "pourquoi c'est plus simple et mieux" depuis .Net 4.5, mais vous pouvez le trouver ici).

En effet, pour chiffrer/déchiffrer du texte, vous aurez besoin de 2 choses :
  • une entrée MachineKey dans votre app.config ou web.config.
  • la classe MachineKey

Première étape donc, vous devez ajouter une ligne dans votre fichier de config, avec vos clefs de chiffrement. Exemple :
<machineKey validationKey="78BEF3A7DF5611DF7D5A4ABF373C539B6A9E7323B13103D5F66A38653686543C084D7574F6D180C9F17AE7F4E4D72C7CD47725946589788C5A8EC916223A9E9B" decryptionKey="A8B2C28F08ADB2D18DAC0E5A642AA90B8BF6A5864499A88ADB7C459D96B885B9" validation="SHA1" decryption="AES" /> 

Vous pouvez générer ce genre d'entrée très facilement grâce à ce site : http://www.allkeysgenerator.com/Random/ASP-Net-MachineKey-Generator.aspx
(ou encore directement via IIS)

Par défaut l'algorithme sera AES, mais vous pouvez changer pour DES ou 3DES si vous préférez (même si je vous conseillerai plutôt de garder AES).

Ensuite, niveau C#... ben rien de plus simple. Vous n'avez plus qu'à appeler la classe MachineKey du namespace System.Web.Security, et ses méthodes Protect et Unprotect :

// ici on va chiffrer notre chaine de caractères
string purpose = "USER_ID"; 
byte[] bytesToEncrypt = Encoding.UTF8.GetBytes(stringToEncrypt);

byte[] encryptedBytes = MachineKey.Protect(bytesToEncrypt, purpose);
string encryptedString = Convert.ToBase64String(encryptedBytes);

// [...]
// ici on va déchiffrer notre chaine de caractères
string purpose = "USER_ID";
byte[] encryptedBytes = Convert.FromBase64String(encryptedData);

string decryptedBytes = MachineKey.Unprotect(encryptedBytes, purpose);
string decryptedString = null;

if (decryptedBytes != null)
{
    decryptedString = Encoding.UTF8.GetString(decryptedBytes);
}

Dernière précision : l'attribut purpose correspond à un tableau de chaines de caractères qui servent à décrire les raisons pour lesquelles on chiffre ces données (comme une sorte de rôle). Cet attribut, s'il est passé au chiffrement, doit être passé également au déchiffrement.
En bref : on met une string propre à la donnée ou au composant, afin de s'assurer que lui seul arrivera à déchiffrer cette donnée, et pas d'autres composants / morceaux de l'application.

Voilà, c'est tout pour moi, bonne journée et bon dev à tous et toutes !

Commentaires fermés

icon Flux RSS des commentaires de cet article

Les commentaires sont fermés pour cet article