Tipp 0187 Benutzerkonto-Login mit SecureString
Autor/Einsender:
Datum:
  Michael Werner
18.11.2008
Entwicklungsumgebung:   VB.Net 2008
Framework:   2.0
Mit dem API LogonUser der advapi32.dll über den Namespace System.Runtime.InteropServices kann ein Benutzerkonto-Login auf Gültigkeit abgefragt werden. Bei der Eingabe des Kennwortes als String ergibt sich aber ein Sicherheitsproblem. Denn eine String-Instanz ist nach dem Erstellen schreibgeschützt und bleibt unverändert im Speicher.
Es ist nicht vorhersagbar, wann die Instanz aus dem Computerspeicher (aus der Garbage Collection) gelöscht wird. Es besteht also das Risiko, dass auf die Daten im Speichern zugegriffen werden kann.
Hier schafft der SecureString im Namespace System.Security Abhilfe. Ein SecureString ist ein String-Objekt, dessen Wert automatisch verschlüsselt wird und der geändert (überschrieben) werden kann. Der String wird explizit aus dem Speicher gelöscht, wenn er nicht mehr benötigt wird.
Im Tipp wird das Windows Benutzerkonto abgefragt (Username und Kennwort). Für die Validitätsprüfung des Logins wird ein Zeiger auf den verschlüsselten Zeichenkettenstring im Speicher gesetzt. Schließlich wird, wenn der PasswordSecureString nicht mehr benötigt wird, der Zeiger auf den SecureString wieder freigegeben.
Codeausschnitt aus dem Formular Form1.vb:
 
Imports System.Security     ' SecureString
Imports System.Runtime.InteropServices ' dllImport
Imports System.Security.Principal ' Username
Imports System.Environment ' NewLine


<DllImport("advapi32.dll", SetLastError:=True, _
  CharSet:=CharSet.Unicode)>
  Shared Function LogonUser(ByVal username As String, _
    ByVal domain As String, ByVal password As IntPtr, _
    ByVal logonType As Integer, ByVal logonProvider As Integer, _
    ByRef token As IntPtr) As Boolean
  End Function

  Private loginName As String

   'Ein SecureString verschlüsselt den Passwortstring
   'und löscht ihn aus dem Speicher ...
  Private loginPasswordSecure As New Security.SecureString

  Private Function LoginValid(ByVal name As String) As Boolean

    Dim tokenHandle As IntPtr = IntPtr.Zero
    Const LOGON32_PROVIDER_DEFAULT As Integer = 0
    Const LOGON32_LOGON_INTERACTIVE As Integer = 2

    Try
      ' Zeiger auf den verschlüsselten Zeichenkettenstring ...
      tokenHandle = _
         Marshal.SecureStringToGlobalAllocUnicode(_
            loginPasswordSecure)
      If (LogonUser(name, "",
        Marshal.SecureStringToGlobalAllocUnicode(_
          loginPasswordSecure), LOGON32_LOGON_INTERACTIVE, _
          LOGON32_PROVIDER_DEFAULT, tokenHandle)) Then
         ' LoginName und Passwort stimmen überein
        Return True
      Else
        tbPassword.Text = String.Empty
         ' Mit Stopwatch die verstrichene Zeit exakt messen
        Dim sw As New Stopwatch()
        Dim count As Integer
        Console.Beep()
        Do While (count < 2)
          sw.Start()
          If sw.ElapsedMilliseconds > 100 Then
             Console.Beep()
             count = count + 1
          End If
        Loop

      End If
      Finally

      If tokenHandle <> IntPtr.Zero Then
        ' Der PasswordSecureString wird nicht mehr benötigt.
        ' Aus Sicherheitsgründen wird der SecureString ...
        ' Freigabe des Zeichenfolgezeigers
        Marshal.ZeroFreeGlobalAllocUnicode(tokenHandle)
      End If
    End Try

    Return False
  End Function
 
Weitere Links zum Thema
Passwortsicherheit durch SaltHash

Windows-Version
98/SE
ME
NT
2000
XP
Vista
Win 7


Download  (18,7 kB) Downloads bisher: [ 332 ]

Vorheriger Tipp Zum Seitenanfang Nächster Tipp

Startseite | Tipps | Projekte | Tutorials | Bücherecke | VB-/VBA-Tipps | API-Referenz | Komponenten | VB.Net-Forum | VB/VBA-Forum | DirectX-Forum | Foren-Archiv | DirectX | Chat | Spielplatz | Links | Suchen | Stichwortverzeichnis | Feedback | Impressum

Seite empfehlen Bug-Report
Letzte Aktualisierung: Dienstag, 20. Dezember 2011