Deutsch
Forum

Probleme mit der Password Funktion

 

Dirk
Kuntzmann
Hallo Profaner,

ich habe heute begonnen ein Progrann weiter zu schreiben, dass ich 2005 begonnen hatte (vermutlich Profan9). Damals lief das Programm einwandfrei. Heute gibt es anscheinend ein Problem mit der Password-Funktion wobei ich nicht glaube das der Fehler im Programm liegt, da dies bereits einwandfrei gearbeitet hat. Getestet habe ich es heute unter Windows2000 und Windows XP. Es geht hier um die Verschlüsselung / Entschlüsselung von dBase-Tabellen. Folgender Programmausschnitt sollte das Problem zeigen:
KompilierenMarkierenSeparieren
declare schrift%,feld$[5],datei$
DECLARE TEXT4&

proc testdateien_erstellen

    assign #1,artikel.str
    rewrite #1
    print #1,ARTIKEL;C;50;0
    print #1,GRUPPE;C;50;0
    print #1,KCAL;C;5;0
    print #1,PORTION;C;3;0
    close #1
    sleep 500
    db(create,artikel.str,test.dbf)

    if datei$=test.dbf

        dbopen(#1,datei$)
        db(go,|<)

        whilenot &dbRecNo=6

            db(appendblank)
            dbput(ARTIKEL,Name)
            dbput(GRUPPE,Gruppe)
            dbput(KCAL,500)
            dbput(PORTION,100)
            dbputrec(0)

        endwhile

        dbgo(5)

    else

        dbopen(#1,datei$)
        dbgo(5)

    endif

    settext text4&,trim$(dbget$(ARTIKEL))
    dbclose(#1)
    copy test.dbf > test1.dbf
    datei$=test1.dbf

endproc

proc rueckschluesseln

    DECLARE DLG&,DIALOGENDE%
    DECLARE TEXT1&,TEXT7&
    DECLARE TEXT2&,Text8&
    DECLARE TEXT3&
    DECLARE EDIT1&
    DECLARE TEXT5&,text6&
    DECLARE BUTTON1&,Button3&
    DECLARE BUTTON2&
    DLG&=CREATE(DIALOG,%HWND,Datenbank rückschlüsseln,351,293,292,213)
    TEXT7& =@CREATE(TEXT,DLG&,Quelle/Ziel:,0010,0010,0100,0020)
    TEXT1& =@CREATE(TEXT,DLG&,Daten vorher:,0010,0040,0100,0020)
    TEXT2& =@CREATE(TEXT,DLG&,Schlüssel:,0010,0070,0100,0020)
    TEXT3& =@CREATE(TEXT,DLG&,Daten nachher:,0010,0120,0100,0020)
    TEXT4& =@CREATE(TEXT,DLG&,,0115,0040,0150,0020)
    EDIT1& =@CREATE(EDIT,DLG&,,0115,0070,0150,0020)
    TEXT5& =@CREATE(TEXT,DLG&,,0115,0120,0150,0020)
    TEXT8& =@CREATE(TEXT,DLG&,,0010,0125,0150,0020)
    text6& =@CREATE(TEXT,DLG&,1. mit Reg-Code;2. mit 12345,0115,0090,0150,0020)
    BUTTON3& =@CREATE(BUTTON,DLG&,>,0110,0010,0020,0024)
    BUTTON1& =@CREATE(BUTTON,DLG&,OK,0010,0150,0070,0024)
    BUTTON2& =@CREATE(BUTTON,DLG&,Abbruch,0100,0150,0070,0024)
    SETFOCUS(edit1&)
    LET DIALOGENDE%=0

    WHILENOT DIALOGENDE%

        WAITINPUT

        If @EQU(%KEY,2)

            LET DIALOGENDE%= 1

        ELSEIF clicked(BUTTON1&) BUTTON

            if trim$(gettext$(edit1&))=

                setfocus(edit1&)

            else

                dbopen(#1,datei$)
                dbgo(|<)

                whilenot %dbeof

                    clear feld$[]
                    PASSWORD trim$(gettext$(edit1&))
                    feld$[1]=pwd$(trim$(dbget$(ARTIKEL)))
                    feld$[2]=pwd$(trim$(dbget$(GRUPPE)))
                    feld$[3]=pwd$(trim$(dbget$(KCAL)))
                    feld$[4]=pwd$(trim$(dbget$(PORTION)))
                    password
                    dbput(ARTIKEL,pwd$(feld$[1]))
                    dbput(GRUPPE,pwd$(feld$[2]))
                    dbput(KCAL,pwd$(feld$[3]))
                    dbput(PORTION,pwd$(feld$[4]))
                    dbputrec(0)
                    dbgo(>)

                wend

                dbclose(#1)
                sleep 500
                dbopen(#1,datei$)
                dbgo(5)
                settext text5&,trim$(dbget$(ARTIKEL))
                dbclose(#1)
                settext edit1&,

            endif

        ELSEIF clicked(BUTTON3&) BUTTON

            datei$=LoadFile$(Umschlüsseln von:,Test*.dbf)

            if datei$=test.dbf

                dbopen(#1,datei$)
                db(go,|<)

                whilenot &dbRecNo=6

                    db(appendblank)
                    dbput(ARTIKEL,Name)
                    dbput(GRUPPE,Gruppe)
                    dbput(KCAL,500)
                    dbput(PORTION,100)
                    dbputrec(0)

                endwhile

                dbgo(5)

            else

                dbopen(#1,datei$)
                dbgo(5)

            endif

            settext text4&,trim$(dbget$(ARTIKEL))
            dbclose(#1)

        ELSEIF clicked(BUTTON2&) BUTTON

            LET DIALOGENDE%= 1

        ENDIF

    WEND

    @DESTROYWINDOW(DLG&)

endproc

cls RGB(23,23,23)
traceon
showmax
let schrift%=create(font,Comic sans MS,16,0,0,0,0)
SETDIALOGFONT schrift%
datei$=test.dbf
testdateien_erstellen
rueckschluesseln
end

Ich hoffe, ich habe die einzelenen Ausschnitte richtig zusammen gestrickt. Nach dem Start werden Testdateien erstellt. Dann erscheint ein Dialog. Bei klick auf den Pfeil erscheint eine Dateiauswahl. Bitte die Test.dbf wählen. Dann wird im Dialog ein Datenfeld angezeigt (unverschlüsselt Name). Jetzt kann ein Schlüssel eingegeben werden z. B. 1. Nach der Bestätigung mit OK werden die Datensätze verschlüsselt und das gleiche Feld wieder angezeigt. Gibt man jetzt wieder als Schlüssel eine 1 ein, müsste die Verschlüsselung rückgängig gemacht werden. Leider fehlt der erste Buchstabe. Gleiches passiert bei der Eingabe eines einzelnen a. Gibt man z. B. 12345 ein arbeitet alles korrekt. Bei abc aber nicht. Hier ist eine entschlüsselung gar nicht möglich. Da in der Hilfe auch keine Einschränkungen gemacht werden wie ein Password aussehen soll und ich glaube, dass das schon einmal funktioniert hat, denke ich fast, das es sich um ein Problem für Roland handelt. Aber vielleicht übersehe ich auch nur etwas. Für einen Tipp wäre ich dankbar.

Gruß Dirk
 
27.07.2007  
 




Michael
Wodrich
Testdateien_erstellen greift auf ein Dialogfeld zu, daß erst in der folgenden Prozedur erstellt wird.
Ich nehme an, dass Du diesen Codeschnipsel nicht getestet hast.

2 Tipps:
a) sende einen funktionierenden Code
(Button 1 entschlüsselt den Detenbankinhalt, der aber nirgendwo verschlüsselt wird)
b) speichere die Umsetzungen/Funktionsergebnisse in einer Variablen und benutze ausschließlich diese Variable hinter PASSWORD. So kannst Du das, was an Password übergeben wird vorher zur Prüfung anzeigen lassen.
Es ist auch möglich, das PASSWORD hier etwas sensibel reagiert, was die Länge des Passwortes angeht. Man sollte grundsätzlich keine Passworte benutzen die kürzer als 8 Zeichen sind. Die 4stelligen Pins der Banken sind ein Sicherheits-Traumschloss. Diesen 4-Zahlen-Code kann man mit einer hohen Trefferquote sogar erraten.

Lass einfach den Computer mal eine 4stellige Zahl ermitteln und versuche 100x sie zu erraten. Die Anzahl der Treffer sagt Dir die prozentuale Trefferquote. Du wirst staunen.

Schöne Grüße
Michael Wodrich

Nachtrag:
Mir ist erst jetzt aufgefallen, das Du mit gesetztem PASSWORD die Datenbankinhalte entschlüsselst um sie dann mit gelöschtem wieder durch die Schlüsselfunktion zu schicken.
Besser ist es wenn Du die Datei unverschlüsselt dann ohne PWD$() speicherst und für das Verschlüsseln eine eigene Routine schreibst. In der von Dir angegebenen Form funktionieren beide Richtungen nicht.
 
Programmieren, das spannendste Detektivspiel der Welt.
27.07.2007  
 




Michael
Wodrich
AUTSCH

Der Fehler liegt ganz einfach in der TRIM$()-Funktion. Sie entfernt auch Steuerzeichen, die im PWD-String aber vorkommen.

Das ist in der Hilfe bei Trim$ eindeutig anders beschrieben !!!

Hier der Testcode:
KompilierenMarkierenSeparieren
declare schrift%,feld$[5],datei$
DECLARE TEXT4&

proc testdateien_erstellen

    assign #1,artikel.str
    rewrite #1
    print #1,ARTIKEL;C;50;0
    print #1,GRUPPE;C;50;0
    print #1,KCAL;C;5;0
    print #1,PORTION;C;3;0
    close #1
    sleep 500
    db(create,artikel.str,test.dbf)

    if datei$=test.dbf

        dbopen(#1,datei$)
        db(go,|<)

        whilenot &dbRecNo=6

            db(appendblank)
            dbput(ARTIKEL,Name)
            dbput(GRUPPE,Gruppe)
            dbput(KCAL,500)
            dbput(PORTION,100)
            dbputrec(0)

        endwhile

        dbgo(5)

    else

        dbopen(#1,datei$)
        dbgo(5)

    endif

    settext text4&,trim$(dbget$(ARTIKEL))
    dbclose(#1)
    copy test.dbf > test1.dbf
    datei$=test1.dbf

endproc

proc rueckschluesseln

    DECLARE DLG&,DIALOGENDE%
    DECLARE TEXT1&,TEXT7&
    DECLARE TEXT2&,Text8&
    DECLARE TEXT3&
    DECLARE EDIT1&
    DECLARE TEXT5&,text6&
    DECLARE BUTTON1&,Button3&
    DECLARE BUTTON2&
    DLG&=CREATE(DIALOG,%HWND,Datenbank rückschlüsseln,351,293,292,213)
    TEXT7& =@CREATE(TEXT,DLG&,Quelle/Ziel:,0010,0010,0100,0020)
    TEXT1& =@CREATE(TEXT,DLG&,Daten vorher:,0010,0040,0100,0020)
    TEXT2& =@CREATE(TEXT,DLG&,Schlüssel:,0010,0070,0100,0020)
    TEXT3& =@CREATE(TEXT,DLG&,Daten nachher:,0010,0120,0100,0020)
    TEXT4& =@CREATE(TEXT,DLG&,,0115,0040,0150,0020)
    EDIT1& =@CREATE(EDIT,DLG&,,0115,0070,0150,0020)
    TEXT5& =@CREATE(TEXT,DLG&,,0115,0120,0150,0020)
    TEXT8& =@CREATE(TEXT,DLG&,,0010,0125,0150,0020)
    text6& =@CREATE(TEXT,DLG&,1. mit Reg-Code;2. mit 12345,0115,0090,0150,0020)
    BUTTON3& =@CREATE(BUTTON,DLG&,>,0110,0010,0020,0024)
    BUTTON1& =@CREATE(BUTTON,DLG&,OK,0010,0150,0070,0024)
    BUTTON2& =@CREATE(BUTTON,DLG&,Abbruch,0100,0150,0070,0024)
    SETFOCUS(edit1&)
    LET DIALOGENDE%=0

    WHILENOT DIALOGENDE%

        WAITINPUT

        If @EQU(%KEY,2)

            LET DIALOGENDE%= 1

        ELSEIF clicked(BUTTON1&)BUTTON

            if trim$(gettext$(edit1&))=

                setfocus(edit1&)

            else

                dbopen(#1,datei$)
                dbgo(|<)

                whilenot %dbeof

                    clear feld$[]
                    PASSWORD trim$(gettext$(edit1&))
                    feld$[1]=pwd$(trim$(dbget$(ARTIKEL)))
                    --- debug-code -------

                    whileloop len(feld$[1])

                        print format$(#0,ord(mid$(feld$[1],&loop,1)));,;

                    endwhile

                    print  len=,format$(#0,len(feld$[1]))
                    feld$[1] = trim$(feld$[1])

                    whileloop len(feld$[1])

                        print format$(#0,ord(mid$(feld$[1],&loop,1)));,;

                    endwhile

                    print  len=,format$(#0,len(feld$[1]))
                    --- debug-code ENDE-------
                    feld$[2]=pwd$(trim$(dbget$(GRUPPE)))
                    feld$[3]=pwd$(trim$(dbget$(KCAL)))
                    feld$[4]=pwd$(trim$(dbget$(PORTION)))
                    dbput(ARTIKEL,feld$[1])
                    dbput(GRUPPE,feld$[2])
                    dbput(KCAL,feld$[3])
                    dbput(PORTION,feld$[4])
                    dbputrec(0)
                    dbgo(>)

                wend

                dbclose(#1)
                sleep 500
                dbopen(#1,datei$)
                dbgo(5)
                settext text5&,trim$(dbget$(ARTIKEL))
                dbclose(#1)
                settext edit1&,

            endif

        ELSEIF clicked(BUTTON3&)BUTTON

            datei$=LoadFile$(Umschlüsseln von:,Test*.dbf)

            if datei$=test.dbf

                dbopen(#1,datei$)
                db(go,|<)

                whilenot &dbRecNo=6

                    db(appendblank)
                    dbput(ARTIKEL,Name)
                    dbput(GRUPPE,Gruppe)
                    dbput(KCAL,500)
                    dbput(PORTION,100)
                    dbputrec(0)

                endwhile

                dbgo(5)

            else

                dbopen(#1,datei$)
                dbgo(5)

            endif

            settext text4&,trim$(dbget$(ARTIKEL))
            dbclose(#1)

        ELSEIF clicked(BUTTON2&)BUTTON

            LET DIALOGENDE%= 1

        ENDIF

    WEND

    @DESTROYWINDOW(DLG&)

endproc

cls RGB(23,23,23)
traceon
showmax
let schrift%=create(font,Comic sans MS,16,0,0,0,0)
SETDIALOGFONT schrift%
datei$=test.dbf
testdateien_erstellen
rueckschluesseln
end

Schöne Grüße
Michael Wodrich
 
Programmieren, das spannendste Detektivspiel der Welt.
27.07.2007  
 




Dirk
Kuntzmann
Hallo Michael,

vielen Dank für deine schnelle Antwort. An die Trim-Funktion hatte ich nicht gedacht. Bleibt die Frage ob das so richtig und gewollt ist oder ob es sich hierbei um einen kleinen Fehler handelt. Ich bin nämlich fest der Meinung, dass dieser Teil früher funktioniert hat.

Mit der Sicherheit der Passwörter hast du natürlich recht, die sind normalerweise auch länger, ich habe jetzt nur kurze gewählt, um das Problem zu verdeutlichen. Z. B. abc schneidet den ersten Buchstaben beim Entschlüsseln ab, während cba funktioniert. A0E96519 wiederum lässt sich überhaupt nicht mehr entschlüsseln. Da die Passwörter aber von jedem Computer anders zusammen gesetzt werden habe ich keinen Einfluss darauf welcher Buchstabe oder welche Zahl wo in dem Passwort auftaucht.

Es gibt somit vermutlich nur zwei Möglichkeiten: 1. Ich warte auf eine trim-Funktion die nichts wegschneidet oder ich versuche das Programm so zu verändern, dass bei allen Passwort-Funktionen die Trim-Funktion nicht genutzt und anders realisiert wird. Die erste Lösung finde ich aber deutlich angenehmer.

Gruß Dirk
 
27.07.2007  
 




Dieter
Zornow
Versuchs mal mit der Api StrTrim, ich denke die sollte funktionieren
KompilierenMarkierenSeparieren
Def StrTrim(2) !SHLWAPI,StrTrimA

Proc ATrim

    parameters besearch$,Char$
    declare besearch#,result$
    Dim besearch#,len(besearch$)+1
    string besearch#,0 = besearch$
    StrTrim(besearch#,addr(char$))
    result$ = string$(besearch#,0)
    dispose besearch#
    return result$

endproc

cls
print ATrim(  Test.exe  , )
waitinput

Viele Grüße aus Banfkok

Dieter
 
Er ist ein Mann wie ein Baum. Sie nennen ihn Bonsai., Win 7 32 bit und Win 7 64 bit, mit XProfan X2
27.07.2007  
 




Dirk
Kuntzmann
Hallo Dieter,

Vielen Dank, von Apis habe ich leider keine Ahnung, aber das was du da gezaubert hat schein super zu funktionieren. Bleibt die Frage, ob die Profan eigene trim-Funktion nun einen Fehler hat oder ob sich dahinter ein Sinn verbirgt.

Gruß Dirk
 
27.07.2007  
 




Dirk
Kuntzmann
P.S. Während man die normale Trim-Funktion von der Geschwindigkeit her kaum wahrnimmt, ist die Api-Variant sehr langsam (bei nur knapp 600 Datensätzen hat man das Gefühl, dass der Rechner stehen geblieben ist).

Gruß Dirk
 
27.07.2007  
 




Jörg
Sellmeyer
Du kannst den Bereich global deklarieren und dimensionieren. Dadurch wird die Prozedur wahrscheinlich etwas schneller:
KompilierenMarkierenSeparieren
Def StrTrim(2) !SHLWAPI,StrTrimA
Declare besearch#
Dim besearch#,24MaximaleZuErwartendeStringlänge%

Proc ATrim

    parameters besearch$,Char$
    string besearch#,0 = besearch$
    StrTrim(besearch#,addr(char$))
    return string$(besearch#,0)

endproc

Print ATrim( test, )
WaitInput
 
Windows XP SP2 XProfan X4
... und hier mal was ganz anderes als Profan ...
27.07.2007  
 



10.000 derartige Operationen benötigen bei mir 750ms

Zu testen über
KompilierenMarkierenSeparieren
 {$cleq}
Def StrTrim(2) !SHLWAPI,StrTrimA
Declare besearch#
Dim besearch#,24MaximaleZuErwartendeStringlänge%

Proc ATrim

    parameters besearch$,Char$
    string besearch#,0 = besearch$
    StrTrim(besearch#,addr(char$))
    return string$(besearch#,0)

endproc

var l&=&gettickcount

whileloop 10000

    ATrim( test, )

wend

print &gettickcount-l&
WaitInput
dispose besearch#

Dieser Code hier hingegen benötigt lediglich 500ms:
KompilierenMarkierenSeparieren und sollte imho auch klappen, denn Ihr braucht garnicht nochmals Speicher reservieren wenn Ihr doch schon genügend Speicher habt. (denn Trim wird den String kaum vergrößern)
 
27.07.2007  
 



Antworten


Thementitel, max. 100 Zeichen.
 

Systemprofile:

Kein Systemprofil angelegt. [anlegen]

XProfan:

 Beitrag  Schrift  Smilies  ▼ 

Bitte anmelden um einen Beitrag zu verfassen.
 

Themenoptionen

1.852 Betrachtungen

Unbenanntvor 0 min.
Walter08.03.2016
funkheld25.05.2012
Andreas Koch16.12.2011

Themeninformationen



Admins  |  AGB  |  Anwendungen  |  Autoren  |  Chat  |  Datenschutz  |  Download  |  Eingangshalle  |  Hilfe  |  Händlerportal  |  Impressum  |  Mart  |  Schnittstellen  |  SDK  |  Services  |  Spiele  |  Suche  |  Support

Ein Projekt aller XProfaner, die es gibt!


Mein XProfan
Private Nachrichten
Eigenes Ablageforum
Themen-Merkliste
Eigene Beiträge
Eigene Themen
Zwischenablage
Abmelden
 Deutsch English Français Español Italia
Übersetzungen

Datenschutz


Wir verwenden Cookies nur als Session-Cookies wegen der technischen Notwendigkeit und bei uns gibt es keine Cookies von Drittanbietern.

Wenn du hier auf unsere Webseite klickst oder navigierst, stimmst du unserer Erfassung von Informationen in unseren Cookies auf XProfan.Net zu.

Weitere Informationen zu unseren Cookies und dazu, wie du die Kontrolle darüber behältst, findest du in unserer nachfolgenden Datenschutzerklärung.


einverstandenDatenschutzerklärung
Ich möchte keinen Cookie