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

C# 如何在数据库中存储system.net.mail密码,c#,asp.net,database,password-encryption,system.net.mail,C#,Asp.net,Database,Password Encryption,System.net.mail,我需要存储将与system.net.mail一起使用的电子邮件密码。这些需要以纯文本的形式检索和发送,但我不想以纯文本的形式存储它们。这并不是真正的安全问题,因为它适用于内部网,我只是不希望结果在CMS中以纯文本显示 我读过很多文章说应该使用SHA1来存储密码。从我所读到的内容来看,哈希是不好的,因为无法检索纯文本 我目前正在尝试以下方法: public static string EncodePasswordToBase64(string password) { try

我需要存储将与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);
        }
    } 

但我似乎无法在数据库中找到正确的数据类型来存储值。其当前设置为nvarchar(最大值)

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

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

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

Q

我应该为这个专栏使用什么数据类型?

好吧,你是对的,散列不是正确的方法。您实际想要使用的是,它允许您对数据库中的数据进行加密,然后在主程序中对其进行解密

AES是推荐的标准。它在C#中的用法


我读了更多关于如何正确选择静脉注射以避免的内容。

您可以使用类似的方法

//用于加密字符串

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字段中。第二种方法获取加密密码并以普通字符串形式返回
我希望这就是你要找的。。我无法对您的问题发表评论。

您可以访问此链接@塔马尔:谢谢,但我已经看过那页上的信息了。是吗?你们两个都得到了选票,但我没有。我还没有那个特权。如果你要投某人的票,你不应该留下评论吗?我不确定。请参阅我的其他注释。@spryce如果您指的是在sql和Q X B j L W V W M X B=中谈论数据类型字段的注释。这将解决你的问题。您可以使用varchar(MAX)字段。从上面的加密函数中得到的字符串类型如下。“tupBY1u4XVY=”不,我是指对Blachshma的评论。我不知道为什么你们两个都被否决了。不是我。我没有足够的代表投票赞成/反对。
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);
    }