19 смертных грехов, угрожающих безопасности программ
Шрифт:
К вашим услугам также утилита aspnet_setreg, позволяющая сохранить и защитить конфигурационные данные.
Отметим, что в .NET Framework 2.0 класс Conf igurationSettings заменен на ConfigurationManager.
Чтение из файловой системы с помощью ASP (VBScript)
Это несколько сложнее, поскольку в ASP нет конфигурационных файлов. Однако можно поместить имя файла в переменную, хранящуюся в файле global.asa (по умолчанию ASP и I IS не возвращают клиенту содержимое этого файла), например так:
Sub Application OnStart
Application("connectFile") = "c:\webapps\config\sqlconn.txt"
End Sub
А
Dim fso, file, pwd
Set fso = CreateObject("Scripting.FileSystemObject")
Set file = fso.OpenTextFile(Application("connectFile"))
connection = file.ReadLine
file.Close
Чтение из реестра с помощью ASP.NET (VB.NET)
Этот код читает не из файла, а из реестра:
With My.Computer.Registry
Dim connection As String =
.GetValue("KKEY_LOCAL_MACHINE\Software\" + _
"MyCompany\WebApp", "connectString", 0)
End With
Замечание по поводу Java и Java KeyStore
В JDK версии 1.2 и старше имеется класс KeyStore для управления ключами (javasecurity.KeyStore), который позволяет хранить сертификаты Х.509, закрытые ключи и – с помощью производных классов – ключи симметричных шифров. Однако KeyStore не предоставляет средств для защиты хранилища ключей. Поэтому если вы хотите получить ключ из программы, то должны прочитать ключ, используемый для шифрования хранилища из какого–то недоступного извне источника, например из файла вне домена приложения или Web–пространства, с помощью этого ключа расшифровать хранилище, получить оттуда закрытый ключ и воспользоваться им.
Поместить ключи в хранилище KeyStore позволяет приложение keytool, поставляемое в составе JDK, а для извлечения оттуда ключа надо написать примерно такой код:
// Получить пароль для открытия хранилища ключей
private static char [] getPasswordFromFile
{
try
{
BufferedReader pwdFile = new BufferedReader
(new FileReader("c:\\webapps\\config\\pwd.txt"));
String pwdString = pwdFile.readLine;
pwdFile.close;
char [] pwd = new char[pwdString.length];
pwdString.getChars(0, pwdString.length, pwd, 0);
return pwd;
}
catch (Exception e) { return null; }
}
private static String getKeyStoreName
{
return "<местоположение имени файла ключей>";
}
public static void main(String args[])
{
try {
KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType);
// получить пароль пользователя и входной файловый поток
FileInputStream fis = new FileInputStream(getKeyStoreName);
char[] password = getPasswordFromFile;
ks.load(fis, password);
fis.close;
Key key = ks.getKey("mykey", password);
// Использовать ключ для криптографических операций
ks.close;
} catch (Exception e) { String s = e.getMessage; }
}
Это, конечно, не идеальное решение, но, по крайней мере, ключами можно управлять с помощью утилиты keytool и, что самое важное, ключ не хранится в самом
Дополнительные защитные меры
Вот небольшой перечень дополнительных защитных мер, которые можно включить в приложение:
□ используйте шифрование при хранении секретной информации и цифровую подпись для обнаружения попыток манипулирования, если нельзя защитить ее с помощью задания строгих ограничений доступа (ACL);
□ используйте ACL или разрешения для ограничения числа лиц, которые имеют доступ (для чтения или записи) к секретным данным, хранящимся на диске;
□ по завершении работы с секретными данными безопасно стирайте память. В таких языках, как Java или управляемый код в .NET, это, вообще говоря, невозможно, но в .NET 2.0 проблема частично решается с помощью класса SecureString.
Другие ресурсы
□ Writing Secure Code, Second Edition by Michael Howard and David C. LeBlanc (Microsoft Press, 2002), Chapter 6, «Determining Appropriate Access Control»
□ Writing Secure Code, Second Edition by Michael Howard and David C. LeBlanc (Microsoft Press, 2002), Chapter 8, «Cryptographic Foibles»
□ Writing Secure Code, Second Edition by Michael Howard and David C. LeBlanc (Microsoft Press, 2002), Chapter 9, «Protecting Secret Data»
□ Windows Access Control:library/en–us/secauthz/security/access_control.asp
□ Windows Data Protection:library/en–us/dnsecure/html/windataprotection–dpapi.asp
□ «How To: Use DPAPI (Machine Store) from : by J.D. Meier, Alex Mackman, Michael Dunner, and Srinath Vasireddy:Hbrary/en–us/dnnetsec/html/SecNetHT08.asp
□ Threat Mitigation Techniques:secbp/security/threat_mitigation_techniques.asp
□ Implementation of SecureZeroMemory:en–us/dncode/html/securel0102002.asp
□ «Making String More Secure»:2004/05/27/143254.aspx
□ «Secure Programming for Linux and Unix HOWTO – Creating Secure Soft–ware» by David Wheeler: www.dwheeler.com/secure–programs
□ Java Security, Second Edition by Scott Oaks (O\'Reilly, 2001), Chapter 5, «Key Management, pp. 79–91
□ Jad Java Decompiler: http://kpdus.tripod.com/jad.html
□ Class KeyStore (Java 2 Platform 5.0):api/java/security/KeyStore.html
□ «Enabling Secure Storage with Keychain Services»:com/d оси me ntation/S ecu rity/Conceptual/keychainServ Concepts/ keychainServConcepts.pdf
□ Java KeyStore Explorer: http://www.lazgosoftware.com/kse/
□ «Enabling Secure Storage With Keychain Services»:apple, com / documentation/Security/Reference/keychainservices/index.html
□ introduction to Enabling Secure Storage With Keychain Services»: developer.apple.com/documentation/Security/Conceptual/keychainServ Concepts/03tasks/chapter_3_section_2.html
□ Knowledge Base Article 329290: «How to use ASP.NET utility to encrypt credentials and session state connection strings»:default.aspx? scid=kb;en–us;329290
□ «Safeguard Database Connection Strings and Other Sensitive Settings in Your Code» by Alek Davis:ProtectYourData/default.aspx