2017-01-20 2 views
0

У меня есть этот класс POCO:C#, Чудной, ПОКО и шифровать/расшифровывать

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; 
    } 

Как я могу сделать для шифрования/дешифрования Password поле, когда я прочитал данные из моей базы данных, и когда я получить доступ к своему объекту POCO от C#?

Я пытался использовать sometingh так:

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; 
    } 

Но когда объекты заполняются данными из моей базы данных, все в порядке, то Password поле правильно расшифровывает, но когда я получить доступ к объекту из C#, чтобы показать в текстовом поле, свойство get снова меняет мои данные:/

+3

Если у вас есть функция, которая расшифровывает пароль, вы делаете это неправильно. [Требуемое чтение] (http://stackoverflow.com/q/1054022/335858). – dasblinkenlight

+3

** Не шифруйте пароли **, когда злоумышленник получает БД, он также получит ключ шифрования. Итерацию над HMAC со случайной солью в течение приблизительно 100 мс и сохранение соли с хешем. Используйте такие функции, как 'password_hash' /' password_verify', 'PBKDF2' (aka' Rfc2898DeriveBytes'), 'Bcrypt' и аналогичные функции. Дело в том, чтобы заставить злоумышленника потратить много времени на поиск паролей грубой силой. – zaph

+0

Спасибо за советы :) –

ответ

0

Это не имеет никакого отношения к Dapper. Также рассмотрите комментарии, отправленные другими на ваш вопрос.

Следующее просто предлагает, как избежать дешифрования дважды в блоке get.

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

Спасибо @ a-j, хорошая идея –