Erweiterte Passwortprüfung

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

Travis

Betreff: Erweiterte Passwortprüfung

BeitragDo, Dez 16, 2004 0:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Mit diesem Programm kann man ein Kennwort erzeugen, bei dessen Abfrage auch das Tippverhalten des Users analysiert wird. Gibt es eine zu grosse Abweichung wird das eingegebene Passwort nicht akzeptiert, selbst wenn es richtig ist.

Weil jeder Benutzer ein anderes Schreibverhalten hat, kann man dies als zusätzlichen Schutz benutzen. Dabei muss man das Kennwort nur möglichst in der gleichen Geschwindigkeit wieder eingeben, wie es ursprünglich festgelegt wurde. Zur Kontrolle wird der Zeitabstand, in dem die einzelnen Buchstaben eingegeben wurden, verglichen. Damit das Kennwort akzeptiert wird, muss dieser Zeitabstand, mit einer gewissen Toleranz, eingehalten werden.


BlitzBasic: [AUSKLAPPEN]

Global PW_TIMER1, PW_TIMER2 ; Arbeitstimer
Global PW_LIMIT = 20 ; Eingabelimit
Global PW_EINGABE$ ; Eingegebener Inhalt
Global PW_STORED_EINGABE$ ; Gespeicherter Inhalt

Dim PW_ZEIT#(50) ; Eingegebene Zeiten
Dim PW_STORED_ZEIT#(50) ; Gespeicherte Zeiten

Graphics 800,600,16,2
SetBuffer BackBuffer()

; Password$=\"R\" ;--- Festlegen des Passwortes überspringen

; --- Hauptschleife ---
Repeat
Cls

If Password$ = \"\" Then
Password$ = InputPassword$(5,5,\"Bitte legen sie ein Passwort fest: \")
Else
If Status = 0 Then
Status = VerifyPassword(5,5,\"Bitte geben Sie ihr Kennwort ein: \")
Else
DebugLog \"Eingabe wurde erkannt als: \" + Status
RuntimeError \"Passwort: \" + Status ; Passwort auswerten (1 = richtig / -1 = falsch / 0 = Eingabe nicht beendet))
EndIf
EndIf

Flip
Until KeyHit(1)
End
; --- Hauptschleife ---



; --- Passwort festlegen ---
Function InputPassword$(x,y,PW_QUESTION$)

If PW_EINGABE$ = \"\" Then PW_TIMER1 = MilliSecs() ; Wurde noch nichts eingegeben, dann Timer starten

a = GetKey() ; Tastendruck erfassen
CurrentLetter = Len(PW_EINGABE$) ; aktuellen Buchstaben ermitteln


If CurrentLetter < PW_LIMIT Then ; Wenn die maximale Zeichenanzahl noch nicht erreicht ist
If a <> 0 And a <> 13 Then ; Wurde eine Taste gedrückt, jedoch nicht Enter
PW_EINGABE$ = PW_EINGABE$ + Chr$(a) ; dann wird der Buchstabe hinzugefügt
PW_STORED_ZEIT(CurrentLetter) = MilliSecs() - PW_TIMER1 ; Zeit speichern
PW_TIMER1 = MilliSecs() ; Timer zurücksetzen
EndIf
EndIf

If KeyDown(14) And Len(PW_EINGABE$) > 0 Then ; Wird BackSpace gedrückt und es wurde bereits etwas eingegeben
If MilliSecs() - PW_TIMER2 > 100 Then ; Wartezeit bis zur Löschung einhalten
PW_TIMER2 = MilliSecs()
PW_EINGABE$ = Left(PW_EINGABE$, Len(PW_EINGABE$)-1) ; letztes Zeichen löschen
EndIf
EndIf

Color 200,200,200
Text x,y, PW_QUESTION$ + PW_EINGABE$ ; Eingabe anzeigen

If KeyHit(28) Then ; Wir Enter gedrückt
SavePassword(\"Test.pwl\")
Return PW_EINGABE$ ; Name übernehmen
EndIf

End Function
; --- Passwort festlegen ---



; --- Passwort prüfen ---
Function VerifyPassword(x,y,PW_QUESTION$)

If PW_STORED_EINGABE$ = \"\" Then
PW_EINGABE$ = \"\"
LoadPassword(\"Test.pwl\")
EndIf

If PW_EINGABE$ = \"\" Then PW_TIMER1 = MilliSecs() ; Wurde noch nichts eingegeben, dann Timer starten

a = GetKey() ; Tastendruck erfassen
CurrentLetter = Len(PW_EINGABE$) ; aktuellen Buchstaben ermitteln


If CurrentLetter < PW_LIMIT Then ; Wenn die maximale Zeichenanzahl noch nicht erreicht ist
If a <> 0 And a <> 13 Then ; Wurde eine Taste gedrückt, jedoch nicht Enter
PW_EINGABE$ = PW_EINGABE$ + Chr$(a) ; dann wird der Buchstabe hinzugefügt
PW_ZEIT(CurrentLetter) = MilliSecs() - PW_TIMER1 ; Zeit speichern
PW_TIMER1 = MilliSecs() ; Timer zurücksetzen
EndIf
EndIf

If KeyDown(14) And Len(PW_EINGABE$) > 0 Then ; Wird BackSpace gedrückt und es wurde bereits etwas eingegeben
If MilliSecs() - PW_TIMER2 > 100 Then ; Wartezeit bis zur Löschung einhalten
PW_TIMER2 = MilliSecs()
PW_EINGABE$ = Left(PW_EINGABE$, Len(PW_EINGABE$)-1) ; letztes Zeichen löschen
EndIf
EndIf

Color 200,200,200
Text x,y, PW_QUESTION$ + PW_EINGABE$ ; Eingabe anzeigen


If KeyHit(28) Then ; Wir Enter gedrückt / Passworteingabe verifizieren

ToleranzFaktor# = .35 ; erlaubte Abweichung in Prozent

For i = 0 To Len(PW_STORED_EINGABE$)-1 ; Tippgeschwindigkeit prüfen
Toleranz# = (PW_ZEIT(i) * ToleranzFAKTOR#)
DebugLog \"Gespeichert: \" + PW_STORED_ZEIT(i) + \" Eingegeben: \" + PW_ZEIT(i) + \" (\" + Abs(PW_STORED_ZEIT(i)-PW_ZEIT(i)) + \"ms / \" + Toleranz + \"ms) Abweichung => \" + ((Abs(PW_STORED_ZEIT(i)-PW_ZEIT(i)) / Toleranz)*100) * ToleranzFaktor+ \"% / \" + 100*ToleranzFaktor
If PW_ZEIT(i) =< PW_STORED_ZEIT(i) + Toleranz Then
Correct = 1
Else
Correct = -1: Return -1
EndIf

If PW_ZEIT(i) => PW_STORED_ZEIT(i) - Toleranz Then
Correct = 1
Else
Correct = -1: Return -1
EndIf
Next

If PW_EINGABE$ = PW_STORED_EINGABE$ Then ; Kennwort vergleichen
Correct = 1
DebugLog \"Passwort richtig.\"
Else
Correct = -1: Return -1
DebugLog \"Passwort falsch.\"
EndIf

EndIf

Return Correct ; Abfrageergebnis an das Hauptprogramm übergeben

End Function
; --- Passwort prüfen ---



; --- Passwort laden ---
Function LoadPassword(File$)

DecryptFile(File$)
Datei = OpenFile(File$)

If Datei <> 0 Then
PW_STORED_EINGABE$ = ReadLine(Datei)
For i = 0 To Len(PW_STORED_EINGABE$)-1
PW_STORED_ZEIT(i) = ReadLine(Datei)
DebugLog \"Lade - ZEITWERT: \" + PW_STORED_ZEIT(i)
Next
Else
RuntimeError \"Kein Passwort definiert. File not found.\"
EndIf

CloseFile Datei
CryptFile(File$)

End Function
; --- Passwort laden ---



; --- Passwort speichern ---
Function SavePassword(File$)

Datei = WriteFile(File$)

WriteLine Datei, PW_EINGABE$

For i = 0 To Len(PW_EINGABE$)-1
WriteLine Datei, PW_STORED_ZEIT(i)
DebugLog \"Speichere - ZEITWERT: \" + PW_STORED_ZEIT(i)
Next

CloseFile Datei
CryptFile(File$)
End Function
; --- Passwort speichern ---



; --- Datei verschlüsseln ---
Function CryptFile(File$)

Datei = OpenFile(File$)

If Datei = 0 Then RuntimeError(\"Die zu verschlüsselnde Datei \" + File$ + \" wurde nicht gefunden.\")

SeekFile Datei, FileSize(File$)-2
Check = ReadShort(Datei)
If Check = 47391 Then RuntimeError(\"Datei ist bereits verschlüsselt\")
SeekFile Datei, 0

For i = 0 To FileSize(File$)
Wert = ReadByte(Datei)
SeekFile Datei, FilePos(Datei)-1
WriteByte Datei, Wert + 9 * i
SeekFile Datei, FilePos(Datei)+1
If Eof(Datei) Then Exit
Next

WriteShort Datei, 47391

CloseFile Datei

End Function
; --- Datei verschlüsseln ---



; --- Datei entschlüsseln ---
Function DecryptFile(File$)

Datei = OpenFile(File$)

If Datei = 0 Then RuntimeError(\"Die zu entschlüsselnde Datei \" + File$ + \" wurde nicht gefunden.\")

SeekFile Datei, FileSize(File$)-2
Check = ReadShort(Datei)
If Check <> 47391 Then RuntimeError(\"Datei ist nicht verschlüsselt\")
SeekFile Datei, 0

For i = 0 To FileSize(File$)
Wert = ReadByte(Datei)
SeekFile Datei, FilePos(Datei)-1
WriteByte Datei, Wert - 9 * i
SeekFile Datei, FilePos(Datei)+1
If Eof(Datei) Then Exit
Next

WriteShort Datei, 0

CloseFile Datei

End Function
; --- Datei entlüsseln ---
www.funforge.org

Ich hasse WASD-Steuerung.

Man kann alles sagen, man muss es nur vernünftig begründen können.

Blatolo

BeitragDo, Dez 16, 2004 7:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Der Tleranzfaktor ist viel zu gering.
Außerdem hat das ganze einen Fehler:
Wenn das pw schneller eingegeben wird ist es schwiriger dieses genau zu treffen als wenn man es langsamer eingibt.
Die relative abweichung ist zwar gleich aber die absolute ist geringer.
Als ich mein pw schnell eingegeben habe hatte ich kaum eine chance es zu schaffen

Ist zwar ganz interressant aber sowas benutzen würde ich nicht, da man nicht immer gleich schnell tippt.

Hummelpups

BeitragDo, Dez 16, 2004 11:34
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich benutze das is einem Spiel, mache mir einen account und erstelle
ein Passwort. Nun gehe ich nach draußen Fußball spielen und komme
spät abends wieder. Ich versuche mich einzulggen in den Acc den
ich vorher erstellt hatte. Meine Finger sind ganz kalt und ich schreibe
langsam da ich die Finger erst nur bedingt bewegen kann. Das heißt,
finger aufwärmen noch mal probieren.

Naja is echt mal ne lustige Idee aber benutzen würde ich es auch nicht.
Programmier lieber nen Retina Scanner mit Hardware Wink

IMurDOOM
blucode - webdesign - Ressource - NetzwerkSim
BlitzBasic 2D - BlitzMax - MaxGUI - Monkey - BlitzPlus

Travis

BeitragDo, Dez 16, 2004 17:58
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, im Prinzip ist es auch nur eine Art Gag. Die Fehlertoleranz ist wirklich zu hoch (bzw. zu niedrig - ihr wisst schon, was ich meine)

Ich hatte mich an einen Fernsehbericht erinnert, in dem darüber gesprochen wurde, dass man verschiedene Computerbenutzer anhand ihres Tippverhaltens identifizieren könne. Wollte mal sehen ob sich das mit Passwörtern umsetzen lassen würde.

Wenn man aber über einen langen Zeitraum immer wieder das gleiche Passwort eingibt, dann tippt man auch immer auf die gleiche Weise. Mir ist es einmal passiert, dass ich das Kennworrt für den Internetzugang einfach vergessen habe, obwohl ich es seit Monaten mehrmals täglich eingegeben habe. Das witzige war aber, dass ich es noch instinktiv eintippen konnte, weil ich die Tastenfolge noch im Kopf hatte, obwohl ich die eigentliche Kennziffer nicht mehr wusste.
www.funforge.org

Ich hasse WASD-Steuerung.

Man kann alles sagen, man muss es nur vernünftig begründen können.
 

IonPainter

BeitragFr, Dez 17, 2004 22:51
Antworten mit Zitat
Benutzer-Profile anzeigen
ich persönlich werde mit der Zeit immer schneller Smile

vor ca. einem Jahr hab ich ca. 90 Anschläge pro Minute geschafft, jetzt ca. 160.

mit 2 Fingern wohlgemerkt Wink)

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group