2017-01-20 1 views
0

J'ai cette classe POCO:C#, Dapper, POCO et Crypter/Décrypter

class Users 
{ 
    public string User { get; set; } 
    public string Password { get; set; } 

    private string Encrypt(string plainText) 
    { 
     ... 
     return encryptedText; 
    } 
    private string Decrypt(string cipherText) 
    { 
     ... 
     return decryptedText; 
    } 

Comment puis-je faire pour champ Crypter/Décrypter Password quand je lis les données de ma base de données et quand j'accéder à mon objet POCO de C#?

Je suis tenté d'utiliser sometingh comme ceci:

class Users 
{ 
    private string _password; 

    public string User { get; set; } 
    public string Password 
    { 
     get 
     { 
      return Encriptar(_password); 
     } 
     set 
     { 
      _password = Desencriptar(value); 
     } 
    } 

    private string Encrypt(string plainText) 
    { 
     ... 
     return encryptedText; 
    } 
    private string Decrypt(string cipherText) 
    { 
     ... 
     return decryptedText; 
    } 

Mais lorsque les objets sont remplis avec les données de ma base de données, tout est ok, le champ Password déchiffre correctement, mais quand j'accéder à un objet C# à afficher dans le champ de texte, la propriété get enrypte à nouveau mes données:/

+3

Si vous avez une fonction qui décrypte un mot de passe, vous le faites mal. [Lecture obligatoire] (http://stackoverflow.com/q/1054022/335858). – dasblinkenlight

+3

** Ne cryptez pas les mots de passe **, lorsque l'attaquant obtient la base de données, il recevra également la clé de cryptage. Iterate sur un HMAC avec un sel aléatoire pendant environ une durée de 100ms et enregistrer le sel avec le hachage. Utilisez des fonctions telles que 'password_hash' /' password_verify', 'PBKDF2' (aka' Rfc2898DeriveBytes'), 'Bcrypt' et des fonctions similaires. Le but est que l'attaquant passe beaucoup de temps à trouver des mots de passe par force brute. – zaph

+0

Merci pour les conseils :) –

Répondre

0

Cela n'a rien à voir avec Dapper. Tenez également compte des commentaires postés par d'autres personnes à votre question. Après suggère simplement comment éviter le décryptage deux fois dans get bloc.

private string _password; 
private bool _isDecrypted = false; 
public string Password 
{ 
    get 
    { 
     if(_isDecrypted == false) 
     { 
      _password = Decrypt(_password); 
      _isDecrypted = true; 
     } 
     return (_password); 
    } 
    set 
    { 
     _password = Encrypt(value); 
     _isDecrypted = false; 
    } 
} 
+0

Merci @ a-j, bonne idée –