Как хранить конфиденциальные данные (например, пароли базы данных) в базе данных Oracle - PullRequest
2 голосов
/ 17 апреля 2019

В основном я создаю WebApp (ASP.NET MVC5), работающий с базой данных Oracle.Приложение подключается к нескольким базам данных Oracle, и администратор должен иметь возможность динамически добавлять новые подключения к базе данных в веб-приложение.

То, как мы делаем это сейчас, когда администратор добавляет новую базу данных через панель администратора,Информация о подключении к базе данных хранится в нашей собственной базе данных Oracle (включая имя пользователя и пароль к базе данных).Эти пароли в настоящее время хранятся в виде открытого текста.

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

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

Я узнал о TDE (прозрачное шифрование данных), но я считаю, что это доступно только в корпоративной редакции Oracle Database, и у меня нет доступак этому.Есть ли другой способ надежно хранить пароли базы данных?Я что-то упустил?

1 Ответ

0 голосов
/ 17 апреля 2019

Вы можете просто зашифровать пароли и сохранить их в базе данных. Когда пользователь меняет пароль или регистрируется в первый раз, просто зашифруйте их. Проверяя проверку, зашифруйте текстовое поле и проверьте, совпадают ли две строки.
А когда вам потребуется знать пароли, расшифруйте их.
Пример кода для шифрования выглядит как

        // 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) для расшифровки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...