Безопасное программирование паролей с помощью .NET - PullRequest
3 голосов
/ 26 января 2012

Я хочу преобразовать безопасный пароль в безопасный хэш-код.лучший метод?

как: SHA1, MD5 и любая комбинация?

string str ="Krishna";

Output:"!#$!$ASDFAS@#$%@";

Ответы [ 4 ]

4 голосов
/ 26 января 2012

Существуют разные способы создания случайных данных, которые можно использовать для засолки.Наиболее распространенные из них:

  • Создание случайного GUID с использованием Guid типа
  • Создание случайной строки цифр с использованием RNGCryptoServiceProvider класса

Чтобы создать новый случайный GUID, мы вызываем метод NewGuid для типа Guid.После генерации мы просто добавляем соль к строке для шифрования.

string saltAsString = Guid.NewGuid().ToString();

Для создания случайной строки цифр с использованием класса RNGCryptoServiceProvider мы сначала инициализируем провайдера и массив byteи затем вызовите метод GetBytes в нашем экземпляре провайдера.

byte[] saltInBytes = new byte[8];
RNGCryptoServiceProvider saltGenerator = new RNGCryptoServiceProvider();
saltGenerator.GetBytes(saltInBytes);
string saltAsString = Convert.ToBase64String(saltInBytes);

Следующий код представляет собой модифицированную версию предыдущего фрагмента для демонстрации засолки.

public void HashText()
{
    string textToHash = "password"; 
    string saltAsString = Guid.NewGuid().ToString();
    byte[] byteRepresentation 
        = UnicodeEncoding.UTF8.GetBytes(textToHash + saltAsString);

    byte[] hashedTextInBytes = null; 
    MD5CryptoServiceProvider myMD5 = new MD5CryptoServiceProvider();
    hashedTextInBytes = myMD5.ComputeHash(byteRepresentation); 
    string hashedText = Convert.ToBase64String(hashedTextInBytes); 

    // will display X03MO1qnZdYdgyfeuILPmQ==
    MessageBox.Show(hashedText);
}
1 голос
/ 29 января 2012

Я бы настоятельно рекомендовал использовать что-то вроде BCrypt вместо SHA1.Использование SHA1 не является отличным способом хранения паролей, так как он очень уязвим для атак по словарю, даже с солью.SHA1 - быстрый алгоритм и предназначен для быстрой работы с большими объемами данных.На более старых компьютерах можно рассчитать миллионов хешей в секунду .

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

Также прочитайте отличную статью, Как безопасно хранить пароль для более подробного объяснения.

1 голос
/ 26 января 2012
public static string Cipher(object obj)
{
    string j = JSON(obj);
    using (AesCryptoServiceProvider aesAlg = new AesCryptoServiceProvider())
    {
        aesAlg.Key = System.Text.Encoding.UTF8.GetBytes("salt");
        aesAlg.IV = System.Text.Encoding.UTF8.GetBytes("salt");
        ICryptoTransform encryptor = aesAlg.CreateEncryptor(aesAlg.Key, aesAlg.IV);
        // Create the streams used for encryption.
        using (MemoryStream msEncrypt = new MemoryStream())
        {
            using (CryptoStream csEncrypt = new CryptoStream(msEncrypt, encryptor, CryptoStreamMode.Write))
            {
                using (StreamWriter swEncrypt = new StreamWriter(csEncrypt))
                {
                    swEncrypt.Write(j);
                }
                byte[] encrypted = msEncrypt.ToArray();
                return Convert.ToBase64String(encrypted).Replace('/', '-').Replace('+', '_').Replace("=", "");
            }
        }
    }
}
1 голос
/ 26 января 2012

Это то, что делает поставщик членства по умолчанию:

 internal string EncodePassword(string pass)
    {
        string salt = GenerateSalt();

        byte[] bytes = Encoding.Unicode.GetBytes(pass);
        byte[] src = Convert.FromBase64String(salt);
        byte[] dst = new byte[src.Length + bytes.Length];
        Buffer.BlockCopy(src, 0, dst, 0, src.Length);
        Buffer.BlockCopy(bytes, 0, dst, src.Length, bytes.Length);
        HashAlgorithm algorithm = HashAlgorithm.Create("SHA1");
        byte[] inArray = algorithm.ComputeHash(dst);

        return Convert.ToBase64String(inArray);
    }

    internal string GenerateSalt()
    {
        RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
        byte[] buff = new byte[32];
        rng.GetBytes(buff);
        return Convert.ToBase64String(buff);
    }
...