Шифрование .NET - PullRequest
       14

Шифрование .NET

0 голосов
/ 22 июля 2011

что я пытаюсь сделать, это когда пользователь регистрирует пароль в зашифрованном виде, а зашифрованный пароль сохраняется в базе данных, и когда пользователь входит в систему, он должен затем расшифровать пароль для сравнения, если пользователь ввел правильный пароль, но когда я пытаюсь расшифровать его, я получаю исключение «Плохие данные».

Пожалуйста, помогите, ребята.Вот мой код:

protected void btnLogin_Click(object sender, EventArgs e)
{
    try
    {
        private Cryptography crypt = new Cryptography();
        var registerUser = new test.Model.User();
        registerUser.EmailAddress = txtEmail.Text;
        registerUser.Password = txtPassword.Text;
        //new test().Getbyusername(registerUser);
        new test().getbyemail(registerUser, crypt);
    }
    catch (Exception ex)
    {

    }
}

public void getbyemail(User user, Cryptography crypt)
{
    try
    {
        var repo = new UserRepository();
        var test = repo.GetEncryptedPasswrd(user);
        var o = repo.getPrivateKey(user.EmailAddress);
        crypt.privateKey = o;
        var j = repo.getpublicKey(user.EmailAddress);
        crypt.publicKey = j;
        decryptPassword(test, o, crypt);

    }
    catch (Exception ex)
    {

    }
}

public String decryptPassword(byte [] encryptedpassword, string privateKey, Cryptography cry)
{
    decrypted = cry.decrypt(encryptedpassword, privateKey);
   //return Encoding.ASCII.GetString(decrypted);
    return Encoding.ASCII.GetString(decrypted);

}

protected void btnRegister_Click(object sender, EventArgs e)
{
    Cryptography crypt = new Cryptography();
    var registerUser = new test.Model.User();
    registerUser.Name = txtName.Text;
    registerUser.Surname = txtSurname.Text;
    registerUser.EmailAddress = txtEmailAddress.Text;
    registerUser.Password = txtPassword.Text;
    registerUser.DateRegisterd = DateTime.Now;
    new test().RegisterUser(registerUser, crypt.privateKey, crypt.publicKey,crypt, encrypted);
}

public void RegisterUser(User user, string privateKey, string publicKey, Cryptography crypt, byte[] encrypted)
{
    try
    {
        var repo = new UserRepository();
        byte[] plainText = Encoding.ASCII.GetBytes(user.Password);
        encrypted = crypt.encrypt(plainText, crypt.publicKey);
        user.Password = Encoding.ASCII.GetString(encrypted);
        user.PrivateKey = crypt.privateKey;
        user.PublickKey = crypt.publicKey;
        repo.Add(user);
    }
    catch (Exception ex)
    {

    }
}

Заранее спасибо.

Ответы [ 4 ]

3 голосов
/ 22 июля 2011

Как уже было сказано выше, вы должны действительно его хешировать.

Тем не менее, если вы хотите зашифровать в качестве примера, не расшифровывайте пароль. Вместо этого вы должны зашифровать пароль от пользователя и просто сравнить с базой данных.

Вы можете рассмотреть эту простую опцию для хеширования пароля. http://davidhayden.com/blog/dave/archive/2004/02/16/157.aspx.

2 голосов
/ 22 июля 2011

Вы должны не шифровать пароли.Шифрование - это обратимый процесс, поэтому, если кто-то украдет ключ шифрования и пароли, он может получить пароль пользователя.

Вместо этого вам следует хешировать пароль и сравнивать хэши.Хеш разрушителен - невозможно получить исходные данные из хеша.Когда пользователь регистрируется, вы сохраняете хеш.Когда они хотят снова войти в систему, вы хэшируете введенные данные и сравниваете хэши в базе данных.Хеш с использованием алгоритма, подобного SHA-256, можно сделать так:

public string GetPasswordHash(string clearPassword)
{
    using (var hash = new System.Security.Cryptography.SHA256Managed())
    {
        var hashBytes = System.Text.Encoding.UTF8.GetBytes(clearPassword);
        return Convert.ToBase64String(hash.ComputeHash(hashBytes));
    }
}

Это продвинет нас на шаг вперед, но вы также должны использовать salt , чтобы предотвратить такие атаки, какРадужные Столы.Кроме того, многократное хеширование (скажем, 10 000) помогает предотвратить атаки против грубой силы.10 000 хешей - это быстрый вход пользователя в систему, но крайне медленная попытка грубой силы.

0 голосов
/ 22 июля 2011

Я бы начал с написания модульного теста, который принимает пароль, шифрует его и сразу же расшифровывает.

Как только вы узнаете, что это работает, сделайте копию зашифрованного пароля и проверьте, сможете ли вы успешно выполнить обход в базу данных.Если это двоичный код, может помочь его кодирование в hex или base64.

0 голосов
/ 22 июля 2011

может быть дыра в безопасности, когда вы можете расшифровать пароль.Что вам следует сделать, так это зашифровать представленный пароль и сравнить зашифрованные строки.

РЕДАКТИРОВАТЬ: спасибо Мэтью ... вот что я имел в виду ... дох

лучший вопрос - почему?Вы в полной мере используете встроенный контроль входа в систему .net?Вам нужно настроить ваш web.config.

для лучшей безопасности.добавьте следующее в настройках провайдера членства в web.config

enablePasswordRetrieval = "False" enablePasswordReset = "True" passwordFormat = "Hashed"

и добавьте машинный ключ в

http://www.qualitydata.com/products/aspnet-membership/help/configuration/no-machinekey.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...