繁体   English   中英

如何在数据库中存储system.net.mail密码

[英]How to store a system.net.mail password in the database

我需要存储将与system.net.mail一起使用的电子邮件密码。 这些需要作为纯文本进行检索和发送,但是我不想将它们存储为纯文本。 这实际上与Intranet的安全性无关,我只是不希望结果在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)。

单元格内容显示如下(每个值之间有空格):

QXB j LWV w MXB =

奇怪的是,当我单击并输入单元格以复制数据时,我得到的是:

我应该为该列使用哪种数据类型?

好吧,您是正确的, 哈希不是正确的方法。 实际要使用的是对称加密 ,它使您可以加密数据库中的数据,然后再将其解密回主程序中。

AES是推荐的标准。 这是一个如何在C#中使用的示例

我已读了更多有关如何正确选择IV以避免常见陷阱的内容

您可以使用类似这样的方法。

//用于加密字符串。

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字段中。 第二种方法采用加密的密码,并以普通字符串返回它,我希望这就是您要查找的内容。我无法在您的问题中发表评论。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM