2012-05-15 3 views
6

Ich muss wissen, wie die SQL Server-Verbindungszeichenfolge für eine WinForms-Anwendung in VB.NET üblich ist.Wie sichere eine Verbindungszeichenfolge in einer WinForms-Anwendung sicher gespeichert werden?

Ich habe das Netz gesucht und ich fand Antworten auf jede der folgenden Fragen:

  • Wie kann ich lesen app.config Werte
  • Wie es Referenz in ASP.NET zu tun: this SO question.
  • Wie speichere ich eine Verbindungszeichenfolge (unverschlüsselt so unsicher)

ich eine volle Antwort möchte, wie in app.config eine Verbindungszeichenfolge in VB.NET speichern (oder settings.settings wenn es besser ist) sicher.

Ist app.config der richtige Ort? Kann ich diese Werte verschlüsseln?

Antwort

9

einfach ermöglicht das .net Framework Sie das zu tun, sehen

http://msdn.microsoft.com/en-us/library/89211k9b(v=vs.80).aspx

Relevante Informationen:

Diese in die machine.config Datei geht:

<configProtectedData defaultProvider="RsaProtectedConfigurationProvider"> 
    <providers> 
    <add name="RsaProtectedConfigurationProvider" 
     type="System.Configuration.RsaProtectedConfigurationProvider, ... /> 
    <add name="DataProtectionConfigurationProvider" 
     type="System.Configuration.DpapiProtectedConfigurationProvider, ... /> 
    </providers> 
</configProtectedData> 

Und das ist der Anwendungscode:

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 

UPDATE 1

Dank @wpcoder, für this link

+0

Ich sollte denken, dass das tun wird, danke. – MarioDS

+1

Da diese Frage ziemlich viele Ansichten enthält, habe ich Ihre Antwort bearbeitet, um sicherzustellen, dass die Informationen nicht verloren gehen, sollte der Link jemals unterbrochen werden. – MarioDS

+1

@pylover _Dies beantwortet die Frage, bietet aber keine geeignete Lösung_. Von MS-Link zur Verfügung gestellt; Der ** Hinweis sagt **: 'Die Verbindungszeichenfolge kann nur auf dem Computer entschlüsselt werden, auf dem sie verschlüsselt wurde. Der [aktualisierte MS-Link für den Artikel könnte die Lösung bieten] (https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/protecting-connection-information) – wpcoder

5

In meinem Job speichern wir die vollständigen Verbindungszeichenfolgen in der app.config, aber wir verschlüsseln sie mit AES256. Es funktioniert ziemlich gut und fügt eine Menge Sicherheit hinzu. Wir haben ein kleines Tool geschrieben, mit dem Sie Verbindungszeichenfolgen verschlüsseln und entschlüsseln können, sodass das Bearbeiten der app.config-Dateien ziemlich einfach ist. Wir haben nur den Verschlüsselungscode in der Anwendung fest codiert. Wenn also jemand die Baugruppen dekompilieren möchte, könnte er es herausfinden, aber es hebt die Messlatte hoch genug für unsere Bedürfnisse. Hier ist die Klasse, die wir verwenden, zu verschlüsseln und zu entschlüsseln, die Verbindungszeichenfolgen:

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 

Eigentlich haben wir eingewickelt, dass innerhalb eines ConnectionStringEncrpyter Klasse, die den geheimen Schlüssel Hardcodes.

+0

Das hört sich toll an, aber können Sie mir sagen, wie es zu codieren? Ich habe eine Verschlüsselungsklasse nur für Kennwörter, nicht für ganze Verbindungszeichenfolgen (Overhead-weise) – MarioDS

+0

@MarioDeSchaepmeester Ich habe einige Beispielcode hinzugefügt. Ich verstehe - Verschlüsselung kann ein Schmerz sein. Wir codieren es nach base64, so dass es gut in der Textdatei gespeichert wird. –

+0

Danke für die Hilfe, aber ich denke, pylover hat mir die Antwort gegeben, nach der ich gesucht habe. – MarioDS

Verwandte Themen