Как безопасно хранить строку подключения в приложении WinForms?
мне нужно знать, каков общий способ хранения строки подключения SQL server для приложения WinForms в VB.NET.
Я искал в сети, и я нашел ответы на каждый из следующих вопросов:
- как читать приложение.значения конфигурации
- как это сделать в ASP.NET ссылки: это так вопрос.
- как сохранить строку подключения (незашифрованную, таким образом, небезопасно)
I хотел бы получить полный ответ о том, как сохранить строку подключения в VB.NET в app.config
(или settings.settings
если это лучше) надежно.
Is app.config
в нужном месте? Можно ли зашифровать эти значения?
2 ответов
просто .net framework позволяет вам это делать, см.
http://msdn.microsoft.com/en-us/library/89211k9b (v=против 80).aspx
соответствующая информация:
это переходит в машины.config:
<configProtectedData defaultProvider="RsaProtectedConfigurationProvider">
<providers>
<add name="RsaProtectedConfigurationProvider"
type="System.Configuration.RsaProtectedConfigurationProvider, ... />
<add name="DataProtectionConfigurationProvider"
type="System.Configuration.DpapiProtectedConfigurationProvider, ... />
</providers>
</configProtectedData>
и это код приложения:
Shared Sub ToggleConfigEncryption(ByVal exeConfigName As String)
' Takes the executable file name without the
' .config extension.
Try
' Open the configuration file and retrieve
' the connectionStrings section.
Dim config As Configuration = ConfigurationManager. _
OpenExeConfiguration(exeConfigName)
Dim section As ConnectionStringsSection = DirectCast( _
config.GetSection("connectionStrings"), _
ConnectionStringsSection)
If section.SectionInformation.IsProtected Then
' Remove encryption.
section.SectionInformation.UnprotectSection()
Else
' Encrypt the section.
section.SectionInformation.ProtectSection( _
"DataProtectionConfigurationProvider") 'this is an entry in machine.config
End If
' Save the current configuration.
config.Save()
Console.WriteLine("Protected={0}", _
section.SectionInformation.IsProtected)
Catch ex As Exception
Console.WriteLine(ex.Message)
End Try
End Sub
обновление 1
спасибо @wpcoder, за этой ссылке
на моей работе мы храним полные строки подключения в приложении.config, но мы шифруем их с помощью AES256. Она работает довольно хорошо и добавляет изрядное количество безопасности. Мы написали небольшой инструмент, который позволяет шифровать и расшифровывать строки подключения Для редактирования приложения.конфигурационные файлы довольно просты. У нас просто есть ключ шифрования, жестко закодированный в приложении, поэтому, если кто-то хотел декомпилировать сборки, он мог бы понять это, но он поднимает планку достаточно высоко для наших нужд. Вот класс мы используйте для шифрования и расшифровки строк подключения:
Public Class Aes256Base64Encrypter
Public Function Decrypt(ByVal encryptedText As String, ByVal secretKey As String) As String
Dim plainText As String = Nothing
Using inputStream As MemoryStream = New MemoryStream(System.Convert.FromBase64String(encryptedText))
Dim algorithm As RijndaelManaged = getAlgorithm(secretKey)
Using cryptoStream As CryptoStream = New CryptoStream(inputStream, algorithm.CreateDecryptor(), CryptoStreamMode.Read)
Dim outputBuffer(0 To CType(inputStream.Length - 1, Integer)) As Byte
Dim readBytes As Integer = cryptoStream.Read(outputBuffer, 0, CType(inputStream.Length, Integer))
plainText = Unicode.GetString(outputBuffer, 0, readBytes)
End Using
End Using
Return plainText
End Function
Public Function Encrypt(ByVal plainText As String, ByVal secretKey As String) As String
Dim encryptedPassword As String = Nothing
Using outputStream As MemoryStream = New MemoryStream()
Dim algorithm As RijndaelManaged = getAlgorithm(secretKey)
Using cryptoStream As CryptoStream = New CryptoStream(outputStream, algorithm.CreateEncryptor(), CryptoStreamMode.Write)
Dim inputBuffer() As Byte = Unicode.GetBytes(plainText)
cryptoStream.Write(inputBuffer, 0, inputBuffer.Length)
cryptoStream.FlushFinalBlock()
encryptedPassword = System.Convert.ToBase64String(outputStream.ToArray())
End Using
End Using
Return encryptedPassword
End Function
Private Function getAlgorithm(ByVal secretKey As String) As RijndaelManaged
Const salt As String = "put a salt key here"
Const keySize As Integer = 256
Dim keyBuilder As Rfc2898DeriveBytes = New Rfc2898DeriveBytes(secretKey, Unicode.GetBytes(salt))
Dim algorithm As RijndaelManaged = New RijndaelManaged()
algorithm.KeySize = keySize
algorithm.IV = keyBuilder.GetBytes(CType(algorithm.BlockSize / 8, Integer))
algorithm.Key = keyBuilder.GetBytes(CType(algorithm.KeySize / 8, Integer))
algorithm.Padding = PaddingMode.PKCS7
Return algorithm
End Function
End Class
фактически, мы завернули это внутри класса ConnectionStringEncrpyter, который жестко кодирует секретный ключ.