- Offizieller Beitrag
Hi,
so ziemlich jeder nimmt am Electronic-Banking teil. Leider hat sich noch nicht bei allen Banken der HBCI-Standard durchgesetzt.
Für all jene, die noch mit TAN/PIN arbeiten (müssen) ist dieses Tool gedacht.
Einige Bankingprogramme bieten ja schon die Speicherung der TAN an. Aber das geschieht entweder im Klartext, oder die ganze Liste wird im Moment des Zugangs zum Programm entschlüsselt. Seeeehr sinnvoll.
(Vielleicht gibt es auch Programme, die es anders machen. Aber die mir bekannten sind nicht so toll.)
In meiner TAN-Verwaltung sind die TAN einmalig, während sie erfaßt werden, in einer Liste unverschlüsselt sichtbar. Sie können dann noch vom User bearbeitet werden (z.B. Schreibfehler korrigieren).
Anschließend wird ein Paßwort angefordert und damit werden die TAN verschlüsselt in einer Datei abgespeichert.
Wenn der User eine TAN verwenden möchte, doppelklickt er darauf in der Liste, gibt den Verwendungszweck ein, anschließend das Paßwort.
Jetzt wird diese eine TAN entschlüsselt und an die Zwischenablage übergeben.
Datum und Verwendungszweck werden anschließend in der Datei gespeichert und die Liste wird aktualisiert.
Spoiler anzeigen
#include <file.au3>
#include <array.au3>
#include <String.au3>
#include <GUIConstants.au3>
#Include <GuiList.au3>
Opt("GUIOnEventMode", 1)
Global Const $WM_COMMAND = 0x0111
Global Const $WM_NOTIFY = 0x004E
Global Const $NM_FIRST = 0
Global Const $NM_LAST = (-99)
Global Const $NM_CLICK = ($NM_FIRST - 2)
Global Const $NM_DBLCLK = ($NM_FIRST - 3)
Global Const $NM_RCLICK = ($NM_FIRST - 5)
Global Const $NM_RDBLCLK = ($NM_FIRST - 6)
Dim $listPath = 'trans_list.txt', $arTAN, $arErfass[1]
Dim $neu = 0, $Salmon = 0xFA8072, $PaleGreen = 0x98FB98
; TAN-Erfassung GUI
$TanErfass = GUICreate("TAN - Liste erfassen", 257, 424, -1, -1)
GUISetOnEvent($GUI_EVENT_CLOSE, "TanErfassClose")
$Label1 = GUICtrlCreateLabel("TAN - Listen - Nr.:", 16, 16, 89, 17)
$inListNr = GUICtrlCreateInput("", 109, 13, 121, 21, BitOR($ES_RIGHT,$ES_AUTOHSCROLL))
$Group1 = GUICtrlCreateGroup(" TAN ", 16, 44, 217, 329)
$lstTAN = GUICtrlCreateList('0', 25, 59, 200, 305, BitOR($WS_VSCROLL,$WS_BORDER))
$mnu = GUICtrlCreateContextMenu($lstTAN)
$itemChange = GUICtrlCreateMenuItem('Ändern', $mnu)
GUICtrlSetOnEvent(-1, 'changeTAN')
$itemDelete = GUICtrlCreateMenuItem('Löschen', $mnu)
GUICtrlSetOnEvent(-1, 'deleteTAN')
GUICtrlCreateGroup("", -99, -99, 1, 1)
$bSave = GUICtrlCreateButton("Verschlüsseln && Speichern", 16, 390, 217, 22, 0)
GUICtrlSetOnEvent(-1, 'bSaveClick')
; /TAN-Erfassung GUI
; Main GUI
$Form1 = GUICreate("TAN - Verwaltung", 667, 363, -1, -1)
GUISetOnEvent($GUI_EVENT_CLOSE, "AForm1Close")
$ListView1 = GUICtrlCreateListView("lfd. Nr.|TAN|Datum|Verwendungszweck", 16, 34, 636, 289, $LVS_NOSORTHEADER, _
BitOR($LVS_EX_GRIDLINES,$LVS_EX_FULLROWSELECT))
_GUICtrlListViewSetColumnWidth(-1, 0, 50)
_GUICtrlListViewSetColumnWidth(-1, 1, 190)
_GUICtrlListViewSetColumnWidth(-1, 2, 100)
_GUICtrlListViewSetColumnWidth(-1, 3, 290)
_GUICtrlListViewJustifyColumn(-1, 0, 1)
_GUICtrlListViewJustifyColumn(-1, 1, 2)
_GUICtrlListViewJustifyColumn(-1, 2, 2)
_GUICtrlListViewJustifyColumn(-1, 3, 0)
$Label1 = GUICtrlCreateLabel("TAN - Listen - Nr.:", 220, 9, 89, 17)
$ListenNr = GUICtrlCreateInput("", 316, 6, 129, 21, BitOR($ES_RIGHT,$ES_AUTOHSCROLL,$ES_READONLY))
$Label2 = GUICtrlCreateLabel("Anzahl freier TAN:", 16, 9, 90, 17)
$freeTAN = GUICtrlCreateInput("", 110, 6, 33, 21, BitOR($ES_RIGHT,$ES_AUTOHSCROLL,$ES_READONLY))
$bTANneu = GUICtrlCreateButton('TAN - Liste erfassen', 502, 6, 150, 21)
GUICtrlSetOnEvent(-1, "bTANneuClick")
$Label3 = GUICtrlCreateLabel("TAN auswählen mit Doppelklick - Dechiffrierung und Übergabe an Zwischenablage nach Paßwort-Abfrage", 16, 336, 636, 17, $SS_CENTER)
; /Main GUI
If _FileReadToArray($listPath, $arTAN) = 0 Then
If MsgBox(262180, 'FEHLER!', 'TAN - Liste konnte nicht geladen werden.' & @LF & 'Datei: ' & $listPath & ' nicht gefunden.' & @LF & _
'Wenn die TAN - Liste bereits angelegt wurde,' & @LF & _
'muß die Datei sich im selben Verzeichnis,' & @LF & _
'wie dieses Programm befinden.' & @LF & @LF & _
'Wollen Sie jetzt eine TAN - Liste erfassen?') = 6 Then
bTANneuClick()
$neu = 1
Else
Exit
EndIf
EndIf
If $neu = 0 Then
_ArrayDelete($arTAN, 0)
GUISetState(@SW_SHOW, $Form1)
_writeListView()
EndIf
GUIRegisterMsg($WM_COMMAND, "MY_WM_COMMAND")
GUIRegisterMsg($WM_NOTIFY, "WM_Notify_Events")
While 1
Sleep(100)
WEnd
Func AForm1Close()
Exit
EndFunc
Func TanErfassClose()
If (Not FileExists($listPath)) Then
MsgBox(0, 'FEHLER!', 'Es wurde noch keine TAN-Liste angelegt!' & @LF & 'Das Programm wird beendet.')
Exit
EndIf
GUISetState(@SW_SHOW, $Form1)
GUISetState(@SW_HIDE, $TanErfass)
EndFunc
Func ListViewDoubleClick()
$idx = _GUICtrlListViewGetSelectedIndices($ListView1)
If String(_GUICtrlListViewGetItemText($ListView1, $idx, 2)) <> '0' Then
MsgBox(0, 'ACHTUNG!', 'Diese TAN wurde bereits verwendet.')
Return
EndIf
If MsgBox(262180, 'TAN abrufen', 'Wollen Sie die TAN mit der' & @LF & 'lfd. Nr.: ' & $idx+1 & @LF & 'jetzt verwenden ?') = 7 Then Return
Local $arReplace[4]=[3,_GUICtrlListViewGetItemText($ListView1, $idx, 1), @MDAY&'.'&@MON&'.'&@YEAR, _
InputBox('Verwendungszweck', 'Bitte geben Sie den Verwendungszweck ein')]
$arTAN[$idx+2] = $arReplace
_writeFromArrayTAN()
ClipPut( _StringEncrypt(0, _GUICtrlListViewGetItemText($ListView1, $idx, 1), _
InputBox('Paßwort Entschlüsselung', 'Bitte jetzt das Paßwort zur Entschlüsselung eingeben.', '', '•')))
MsgBox(0, 'Zwischenablage', 'Die TAN wurde in die Zwischenablage eingefügt.')
_GUICtrlListViewDeleteAllItems($ListView1)
_FileReadToArray($listPath, $arTAN)
_ArrayDelete($arTAN, 0)
_writeListView()
EndFunc
Func _writeFromArrayTAN()
Local $arTmp[UBound($arTAN)]
$arTmp[0] = $arTAN[0]
$arTmp[1] = $arTAN[1]
For $i = 2 To UBound($arTAN)-1
$arTmp[$i] = _SubArrayGetEntry($arTAN, 1, $i) & ';' & _
_SubArrayGetEntry($arTAN, 2, $i) & ';' & _
_SubArrayGetEntry($arTAN, 3, $i)
Next
If FileExists($listPath) Then FileMove($listPath, $listPath & '.BAK')
_FileWriteFromArray($listPath, $arTmp)
EndFunc
Func bTANneuClick()
If FileExists($listPath) Then MsgBox(0, 'HINWEIS', 'Nach dem Erfassen einer neuen TAN - Liste' & @LF & _
'kann auf die bisherige Liste nicht mehr zugegriffen werden.' & @LF & _
'Sie wird unter dem Namen: ' & $listPath & '.BAK im Programmverzeichnis abgelegt.')
GUISetState(@SW_HIDE, $Form1)
GUISetState(@SW_SHOW, $TanErfass)
SplashTextOn('TAN - Nummern eingeben', @LF & ' Um die Erfassung der TAN - Nummern zu aktivieren,' & @LF & _
' bitte einen Doppelklick in die Liste ausführen' & @LF & _
' Um das Eingabefenster zu schließen, bei leerem Eingabefeld OK klicken.' & @LF & _
' Per Rechtsklick auf einen markierten Eintrag kann dieser:' & @LF & _
' - geändert oder' & @LF & _
' - gelöscht werden.', 550, 150, -1, -1, 4)
Sleep(12000)
SplashOff()
EndFunc
Func _writeListView()
Local $free = 0, $arLV[UBound($arTAN)-2]
GUICtrlSetData($ListenNr, $arTAN[0])
For $i = 2 To UBound($arTAN)-1
$arTAN[$i] = StringSplit($arTAN[$i], ';')
$arLV[$i-2] = GUICtrlCreateListViewItem($i-1 & '|' & _SubArrayGetEntry($arTAN, 1, $i) _
& '|' & _SubArrayGetEntry($arTAN, 2, $i) _
& '|' & _SubArrayGetEntry($arTAN, 3, $i), $ListView1)
If _SubArrayGetEntry($arTAN, 2, $i) = 0 Then
$free += 1
GUICtrlSetBkColor($arLV[$i-2], $PaleGreen)
Else
GUICtrlSetBkColor($arLV[$i-2], $Salmon)
EndIf
Next
GUICtrlSetData($freeTAN, $free)
EndFunc
Func List_DoubleClick()
$TAN = InputBox('TAN - Erfassung', 'Bitte hier die TAN eingeben')
If $TAN <> '' Then
_GUICtrlListAddItem($lstTAN, $TAN)
_GUICtrlListReplaceString($lstTAN, 0, String(_GUICtrlListCount($lstTAN)-1))
Else
Return
EndIf
List_DoubleClick()
EndFunc
Func changeTAN()
$idx = _GUICtrlListGetCaretIndex($lstTAN)
$new = InputBox('TAN - Erfassung', 'Bitte korrigieren', _GUICtrlListGetText($lstTAN, $idx))
If $new <> '' Then _GUICtrlListReplaceString($lstTAN, $idx, String($new))
EndFunc
Func deleteTAN()
$idx = _GUICtrlListGetCaretIndex($lstTAN)
If MsgBox(262180, 'Löschen', 'Soll:' & @LF & _GUICtrlListGetText($lstTAN, $idx) & @LF & 'wirklich gelöscht werden?') = 6 Then
_GUICtrlListDeleteItem($lstTAN, $idx)
_GUICtrlListReplaceString($lstTAN, 0, String(_GUICtrlListCount($lstTAN)-1))
EndIf
EndFunc
Func bSaveClick()
$listNr = GUICtrlRead($inListNr)
If $listNr = '' Then
MsgBox(0, '', 'Listen-Nr. wurde nicht erfaßt!')
Return
EndIf
$anz = _GUICtrlListCount($lstTAN)
If $anz < 2 Then
MsgBox(0, '', 'Keine TAN-Nr. erfaßt!')
Return
EndIf
ReDim $arErfass[$anz+1]
$arErfass[0] = $listNr
$arErfass[1] = $anz
$KEY = InputBox('Paßwort Verschlüsselung', 'Bitte jetzt das Paßwort zur Verschlüsselung eingeben.', '', '•')
For $i = 1 To $anz-1
$arErfass[$i+1] = _StringEncrypt(1, _GUICtrlListGetText($lstTAN, $i), $KEY) & ';0;'
Next
If FileExists($listPath) Then FileMove($listPath, $listPath & '.BAK', 1)
_FileWriteFromArray($listPath, $arErfass)
_GUICtrlListViewDeleteAllItems($ListView1)
_FileReadToArray($listPath, $arTAN)
_ArrayDelete($arTAN, 0)
TanErfassClose()
_writeListView()
EndFunc
Func _SubArrayGetEntry($ARRAY, $SubIdx, $iDim1, $iDim2=-1)
If (Not IsArray($ARRAY)) Then
SetError(1)
Return 0
EndIf
If ($iDim1 < 0) Or ($iDim1 > UBound($ARRAY)-1) Then
SetError(2)
Return 0
EndIf
Local $UbSecond = UBound($ARRAY, 2)
If @error Then
If $iDim2 <> -1 Then
SetError(3)
Return 0
EndIf
ElseIf ($iDim2 < -1) Or ($iDim2 > $UbSecond-1) Then
SetError(2)
Return 0
EndIf
Local $sub
Switch $iDim2
Case -1
$arSub = $ARRAY[$iDim1]
Case Else
$arSub = $ARRAY[$iDim1][$iDim2]
EndSwitch
If ($SubIdx < 0) Or ($SubIdx > UBound($arSub)-1) Then
SetError(4)
Return 0
Else
Return $arSub[$SubIdx]
EndIf
EndFunc
Func MY_WM_COMMAND($hWnd, $msg, $wParam, $lParam)
Local $nNotifyCode = BitShift($wParam, 16)
Local $nID = BitAND($wParam, 0xFFFF)
Local $hCtrl = $lParam
Local Const $LBN_ERRSPACE = (-2);
Local Const $LBN_SELCHANGE = 1;
Local Const $LBN_DBLCLK = 2;
Local Const $LBN_SELCANCEL = 3;
Local Const $LBN_SETFOCUS = 4;
Local Const $LBN_KILLFOCUS = 5;
Switch $nID
Case $lstTAN
Switch $nNotifyCode
Case $LBN_ERRSPACE
;~ _DebugPrint("$LBN_ERRSPACE")
Case $LBN_SELCHANGE
;~ _DebugPrint("$LBN_SELCHANGE")
Case $LBN_SELCANCEL
;~ _DebugPrint("$LBN_SELCANCEL")
Case $LBN_SETFOCUS
;~ _DebugPrint("$LBN_SETFOCUS")
Case $LBN_KILLFOCUS
;~ _DebugPrint("$LBN_KILLFOCUS")
Case $LBN_DBLCLK
List_DoubleClick()
EndSwitch
EndSwitch
; Proceed the default Autoit3 internal message commands.
; You also can complete let the line out.
; !!! But only 'Return' (without any value) will not proceed
; the default Autoit3-message in the future !!!
Return $GUI_RUNDEFMSG
EndFunc ;==>MY_WM_COMMAND
Func WM_Notify_Events($hWndGUI, $MsgID, $wParam, $lParam)
;#forceref $hWndGUI, $MsgID, $wParam
Local $tagNMHDR, $event, $hwndFrom, $code
$tagNMHDR = DllStructCreate("int;int;int", $lParam);NMHDR (hwndFrom, idFrom, code)
If @error Then Return
$event = DllStructGetData($tagNMHDR, 3)
Select
Case $wParam = $ListView1
Select
Case $event = $NM_CLICK
;~ ListView_Click ()
Case $event = $NM_DBLCLK
ListViewDoubleClick()
Case $event = $NM_RCLICK
;~ ListView_RightClick ()
Case $event = $NM_RDBLCLK
;~ ListView_RightDblClick ()
EndSelect
EndSelect
$tagNMHDR = 0
$event = 0
$lParam = 0
EndFunc ;==>WM_Notify_Events
Und so sieht es aus: