我如何在Oracle数据库中存储敏感数据(例如数据库密码)

时间:2019-04-17 11:34:31

标签: asp.net oracle security encryption

基本上,我正在构建使用Oracle数据库的WebApp(ASP.NET MVC5)。该应用程序连接到多个oracle数据库,并且管理员应能够将新的数据库连接动态添加到该webapp。

我们现在的操作方式,当管理员通过管理面板添加新数据库时,数据库连接信息存储在我们自己的Oracle数据库中(包括数据库的用户名和密码)。这些密码当前以纯文本格式存储。

Web应用程序所需要做的就是从我们自己的数据库中检索数据库凭据,将它们格式化为连接字符串并连接到数据库。

问题是,如果我们对密码进行哈希处理,它们将无法在连接字符串中使用,也根本不会增加任何安全性。这些密码的所有加密都应在数据库侧进行。

我发现了有关TDE(透明数据加密)的信息,但是我相信这仅在Oracle数据库的企业版中可用,我无权访问。还有其他方法可以安全地存储数据库密码吗?我想念什么吗?

1 个答案:

答案 0 :(得分:0)

您可以简单地加密密码并将其存储在数据库中。用户更改密码或首次注册时,只需对其进行加密。在检查验证时,请加密文本框并检查两个字符串是否匹配。
当您需要知道密码时,请对其解密。
加密的示例代码如下

        // Encrypt the text
        public static string EncryptText(string strText)
        {
            return Encrypt(strText, "a#94tOc*"); // use any string to encrypt other than a#94tOc*
        }

        //The function used to encrypt the text
        private static string Encrypt(string strText, string strEncrKey)
        {
            byte[] byKey = { };
            byte[] IV = { 0X12, 0X34, 0X56, 0X78, 0X90, 0XAB, 0XCD, 0XEF };
            byKey = System.Text.Encoding.UTF8.GetBytes(strEncrKey.Substring(0, 8));
            DESCryptoServiceProvider des = new DESCryptoServiceProvider();
            byte[] inputByteArray = System.Text.Encoding.UTF8.GetBytes(strText);
            MemoryStream ms = new MemoryStream();
            CryptoStream cs = new CryptoStream(ms, des.CreateEncryptor(byKey, IV), CryptoStreamMode.Write);
            cs.Write(inputByteArray, 0, inputByteArray.Length);
            cs.FlushFinalBlock();
            return Convert.ToBase64String(ms.ToArray());
        }

类似于解密,请使用:

        //Decrypt the text 
        public static string DecryptText(string strText)
        {
            return Decrypt(strText, "a#94tOc*"); // use same as encryption string
        }
        //The function used to decrypt the text
        private static string Decrypt(string strText, string sDecrKey)
        {
            byte[] byKey = { };
            byte[] IV = { 0X12, 0X34, 0X56, 0X78, 0X90, 0XAB, 0XCD, 0XEF };
            byte[] inputByteArray = new byte[strText.Length + 1];
            byKey = System.Text.Encoding.UTF8.GetBytes(sDecrKey.Substring(0, 8));
            DESCryptoServiceProvider des = new DESCryptoServiceProvider();
            inputByteArray = Convert.FromBase64String(strText.Replace(' ', '+'));
            MemoryStream ms = new MemoryStream();
            CryptoStream cs = new CryptoStream(ms, des.CreateDecryptor(byKey, IV), CryptoStreamMode.Write);
            cs.Write(inputByteArray, 0, inputByteArray.Length);
            cs.FlushFinalBlock();
            System.Text.Encoding encoding = System.Text.Encoding.UTF8;
            return encoding.GetString(ms.ToArray());
        }

因此基本上,只需调用EncryptText(password)进行加密,然后调用DecryptText(encrypted_password)进行解密。