![]() |
|
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
|
|
|
|
|
|
|
| Windows-Version |
| 98/SE |
 |
|
| ME |
 |
|
| NT |
 |
|
| 2000 |
 |
|
| XP |
 |
|
| Vista |
 |
|
| Win
7 |
 |
|
|
|
Download (18,7
kB)
|
Downloads bisher: [ 332 ]
|
|
|