Как сохранить пароль system.net.mail в базе данных

Мне нужно хранить пароли электронной почты, которые будут использоваться с system.net.mail. Их нужно извлекать и отправлять в виде обычного текста, но я не хочу хранить их в виде обычного текста. На самом деле речь идет не о безопасности, а о внутренней сети, и я просто не хочу, чтобы результаты отображались в виде обычного текста в CMS.

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

В настоящее время я пробую эти методы:

public static string EncodePasswordToBase64(string password)
    {
        try
        {
            byte[] encData_byte = new byte[password.Length];
            encData_byte = System.Text.Encoding.UTF8.GetBytes(password);
            string encodedData = Convert.ToBase64String(encData_byte);
            return encodedData;
        }
        catch (Exception ex)
        {
            throw new Exception("Error in base64Encode" + ex.Message);
        }
    } 

а также

public static string DecodeFrom64(string encodedData)
    {
        System.Text.UTF8Encoding encoder = new System.Text.UTF8Encoding();
        System.Text.Decoder utf8Decode = encoder.GetDecoder();
        byte[] todecode_byte = Convert.FromBase64String(encodedData);
        int charCount = utf8Decode.GetCharCount(todecode_byte, 0, todecode_byte.Length);
        char[] decoded_char = new char[charCount];
        utf8Decode.GetChars(todecode_byte, 0, todecode_byte.Length, decoded_char, 0);
        string result = new String(decoded_char);
        return result;
    }

но я не могу найти правильный тип данных в моей базе данных для хранения значения. В настоящее время установлено значение nvarchar(MAX).

Содержимое ячейки отображается следующим образом (с пробелами между значениями):

Q X B j L W V w M X B =

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

Q

Какой тип данных следует использовать для этого столбца?


person spryce    schedule 03.02.2013    source источник
comment
вы можете перейти по этой ссылке. ‹stackoverflow.com/questions/ 1054022/  -  person Tamal Kanti Dey    schedule 03.02.2013
comment
@Tamal Спасибо, но я уже прочитал информацию на этой странице. Вы?   -  person spryce    schedule 03.02.2013


Ответы (2)


Вы можете использовать что-то вроде этого.

//Для шифрования строки.

public static string Encrypt(string toEncrypt, bool useHashing)
    {
        byte[] keyArray;
        byte[] toEncryptArray = UTF8Encoding.UTF8.GetBytes(toEncrypt);
        string key = "UglyRandomKeyLike-lkj54923c478";
        if (useHashing)
        {
            MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider();
            keyArray = hashmd5.ComputeHash(UTF8Encoding.UTF8.GetBytes(key));
            hashmd5.Clear();
        }
        else
            keyArray = UTF8Encoding.UTF8.GetBytes(key);

        TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
        tdes.Key = keyArray;
        tdes.Mode = CipherMode.ECB;
        tdes.Padding = PaddingMode.PKCS7;

        ICryptoTransform cTransform = tdes.CreateEncryptor();
        byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);
        tdes.Clear();
        return Convert.ToBase64String(resultArray, 0, resultArray.Length);
    }

// Чтобы расшифровать строку

public static string Decrypt(string cipherString, bool useHashing)
    {
        byte[] keyArray;
        byte[] toEncryptArray = Convert.FromBase64String(cipherString);
        string key = "UglyRandomKeyLike-lkj54923c478";
        if (useHashing)
        {
            MD5CryptoServiceProvider hashmd5 = new MD5CryptoServiceProvider();
            keyArray = hashmd5.ComputeHash(UTF8Encoding.UTF8.GetBytes(key));
            hashmd5.Clear();
        }
        else
            keyArray = UTF8Encoding.UTF8.GetBytes(key);

        TripleDESCryptoServiceProvider tdes = new TripleDESCryptoServiceProvider();
        tdes.Key = keyArray;
        tdes.Mode = CipherMode.ECB;
        tdes.Padding = PaddingMode.PKCS7;

        ICryptoTransform cTransform = tdes.CreateDecryptor();
        byte[] resultArray = cTransform.TransformFinalBlock(toEncryptArray, 0, toEncryptArray.Length);

        tdes.Clear();
        return UTF8Encoding.UTF8.GetString(resultArray);
    }

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

person Ravi    schedule 03.02.2013
comment
Я не уверен. Пожалуйста, смотрите мой другой комментарий. - person spryce; 04.02.2013
comment
@spryce, если вы имеете в виду комментарий, в котором вы говорите о поле типа данных в sql и Q X B j L W V w M X B =. Это решит вашу проблему. Вы можете взять поле varchar(MAX). И тип строки, которую вы получите из приведенной выше функции шифрования, будет примерно таким. tupBY1u4XVY= - person Ravi; 04.02.2013
comment
Нет, я имел в виду комментарий к Блахшме. Я не уверен, почему вы оба проголосовали. Это был не я. У меня недостаточно представителей, чтобы голосовать за/против. - person spryce; 04.02.2013

Что ж, вы правы в том, что хеширование — неправильный путь. На самом деле вы хотите использовать симметричное шифрование, которое позволяют вам шифровать данные в БД, а затем расшифровывать их обратно в вашей основной программе.

AES является рекомендуемым стандартом. Вот пример того, как это использовалось в C#.

Я бы прочитал немного больше о том, как правильно выбрать IV, чтобы избежать распространенных ошибок.

person Blachshma    schedule 03.02.2013
comment
Вы оба получили отрицательные голоса, но не от меня. У меня пока нет такой привилегии. Разве вы не должны оставлять комментарий, если собираетесь кого-то проголосовать против? - person spryce; 04.02.2013