#asp.net #oracle #security #encryption
#asp.net #Oracle #Безопасность #шифрование
Вопрос:
В основном я создаю веб-приложение (ASP.NET MVC5) работа с базой данных Oracle. Приложение подключается к нескольким базам данных Oracle, и администратор должен иметь возможность динамически добавлять новые подключения к базе данных к веб-приложению.
То, как мы делаем это сейчас, когда администратор добавляет новую базу данных через панель администратора, информация о подключении к базе данных сохраняется в нашей собственной базе данных Oracle (включая имя пользователя и пароль к базе данных).). В настоящее время эти пароли хранятся в виде открытого текста.
Все, что нужно сделать веб-приложению, это получить учетные данные базы данных из нашей собственной базы данных, отформатировать их в строку подключения и подключиться к базе данных.
Проблема в том, что если мы хэшируем пароли, они не будут работать в строке подключения, и это не добавит никакой безопасности вообще. Все шифрование этих паролей должно происходить на стороне базы данных.
Я узнал о TDE (transparant data encryption), но я считаю, что это доступно только в корпоративной версии Oracle Database, и у меня нет к этому доступа. Есть ли какой-либо другой способ безопасного хранения паролей базы данных? Я что-то упустил?
Комментарии:
1. Хороший вопрос. Если вы хотите использовать собственное 2-стороннее шифрование, чтобы вы могли зашифровать новый пароль и сохранить его в зашифрованном виде, затем расшифруйте его для использования при подключении к базе данных. Я бы предложил, поскольку учетная запись / пароль должны использоваться веб-приложением, возможно, иметь двойное шифрование, где обычный pwd разрешается только путем объединения расшифровки PLSQL и расшифровки WebApp, например
clearTextPwd = WebAppDecrypt(PLSQLDecyrpt(db_stored_enc_pwd))
. Эффективно 2 ключа. Если это вас пугает, посмотрите наEXTERNALLY IDENTIFIED
пользователей в Oracle с помощью чего-то вроде Kerberos.
Ответ №1:
Вы можете просто зашифровать пароли и сохранить их в базе данных. Когда пользователь меняет пароль или регистрируется в первый раз, просто зашифруйте их. При проверке проверки зашифруйте текстовое поле и проверьте, совпадают ли две строки.
И когда вам потребуется знать пароли, расшифруйте их.
Пример кода для шифрования выглядит следующим образом
// 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)
дешифрования.
Комментарии:
1. Но где я буду хранить ключ шифрования?
2. Вы можете сохранить его в файлах C # или вы можете сохранить его в базе данных.
3. Но тогда как я могу безопасно хранить ключ шифрования в базе данных?
4. На самом деле вы можете просто сохранить их в файлах C #, поскольку вы знаете свой ключ шифрования, и пароли будут зашифрованы