Probleme mit crypt() aus den xbase-Tools

Auf dem Weg von Clipper, FoxPro u.ä. nach Xbase++

Moderator: Moderatoren

Antworten
Roland
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 29
Registriert: So, 05. Nov 2006 0:39
Wohnort: Witten

Probleme mit crypt() aus den xbase-Tools

Beitrag von Roland »

Hallo zusammen!
Seit 2 Tagen schlage ich mich mit folgendem Problem herum:
Ich habe von Clipper eine DBF-Datei übernommen, in der einige Felder mit crypt() verschlüsselt sind. Unter Clipper konnten diese Felder auch einwandfrei in einen lesbaren Zustand zurückgebracht werden.
Nur funktioniert das leider bei meiner im Aufbau begriffenen GUI-Anwendung nicht. Ich kann Passwörter verschlüsseln und sie werden mit

Code: Alles auswählen

	cCalias := ConvToAnsiCP(Crypt(cEpass,key()))
	seek cCalias
auch sauber gefunden.
cEpass ist das eingebene Passwort und die funktion key() liefert lediglich den Verschlüsselungsstring zurück.
Nur: Ich kann keinen verschlüsselten Begriff aus einem Datenbankfeld in lesbare Form zurückbringen. Es hat irgendwie mit ANSI-OEM zu tun, habe das auch schon in jeder denkbaren Variante durchgespielt, aber irgendwo liegt noch ein Hund begraben.

Danke schön im voraus für jede Hilfe!
Es grüßt der Roland
Die Wege der Bytes sind unerforschlich!
Benutzeravatar
Rolf Ramacher
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1930
Registriert: Do, 09. Nov 2006 10:33
Wohnort: Bergheim
Danksagung erhalten: 3 Mal
Kontaktdaten:

Verschlüsselung

Beitrag von Rolf Ramacher »

Hallo Roland,


also ich bin bei solchen Geschichten manchmal auch am rätseln, ob dies
comtooemcp oder comvtoAnsiCp ist. versuchs einfach mal mit
ConvtoOemCp
Gruß Rolf

Mitglied der Gruppe XUG-Cologne
www.xug-cologne.de
jono3110
Rookie
Rookie
Beiträge: 2
Registriert: Fr, 10. Nov 2006 12:17
Wohnort: Jever

crypt()

Beitrag von jono3110 »

Hallo

Hast du bei den Datenbankfeldern an die nachfolgenden Leerzeichen gedacht. Einlesen UND Auslesen mit crypt() muß immer identische Gesamtlänge des Datenfeldes haben. Sonst ist nichts zu lesen.

Gruß - Joachim
Benutzeravatar
Rolf Ramacher
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1930
Registriert: Do, 09. Nov 2006 10:33
Wohnort: Bergheim
Danksagung erhalten: 3 Mal
Kontaktdaten:

Verschlüsselung

Beitrag von Rolf Ramacher »

Hallo Joachim,


ich arbeite hierbei immer mit alltrim. Sollte funktionieren.
Gruß Rolf

Mitglied der Gruppe XUG-Cologne
www.xug-cologne.de
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: Verschlüsselung

Beitrag von AUGE_OHR »

hi,
Rolf Ramacher hat geschrieben: Nur funktioniert das leider bei meiner im Aufbau begriffenen GUI-Anwendung nicht.
...
ich arbeite hierbei immer mit alltrim. Sollte funktionieren.
nope, wenn du in GUI ein SLE verwendest hast du ein datalink ?
wenn ja, dann MUSS die FELD-Länge stimmen d.h. mit SPACE()
auffüllen.

gruss by OHR
Jimmy
Roland
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 29
Registriert: So, 05. Nov 2006 0:39
Wohnort: Witten

Keine Lösung ist auch eine Lösung

Beitrag von Roland »

Hallo, melde mich mal wieder zurück. Habe viel rumexperimentiert und meine Anwendung wächst und gedeiht so langsam. Nur ist dieser Punkt mit dem CRYPT() hier noch offen.

Ich habe schlußendlich den Befehl ins Nirwana geschickt und mir eine eigene Verschlüsselungsroutine geschrieben. Die arbeitet zufriedenstellend, ist case-sensitive und arbeitet auch bei Passwörtern mit Umlauten korrekt.

Ein frohes neues Jahr und Grüße vom

Roland
Die Wege der Bytes sind unerforschlich!
Ewald
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 475
Registriert: Sa, 08. Apr 2006 14:07
Wohnort: Datteln
Danksagung erhalten: 3 Mal
Kontaktdaten:

Beitrag von Ewald »

Hallo Roland,
ich bin auf der Suche nach eine crypt() Lösung auf deinen Beitrag gestoßen. Ich verwende seit langer Zeit Clipper Datenbanken mit crypt() auch unter xbase++. Probleme treten bei mir jetzt auf, weil ich auf den ADS gehen wollte. Im Zuge dieser Versuche habe ich dann mal irgendwo in meinen Quellcode die schicksalschwere Zeile geschrieben - set charset to ansi -. Damit war es um die Verschlüsselung geschehen. Ein Rückholen der Werte ging nicht mehr. Nachdem ich die Ursache gefunden habe und charset wieder auf oem gestellt habe, waren die Probleme weg. Vielleicht hilft diese Info ja noch. Was hast du dir für eine Verschlüsselungroutine geschrieben ? Irgendwas mit einer Schleife ?
Gruß
Ewald
Roland
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 29
Registriert: So, 05. Nov 2006 0:39
Wohnort: Witten

Schleife

Beitrag von Roland »

Hallo Ewald,
herzlichen Dank für deine Zeilen. Jawohl, es handelt sich tatsächlich um Schleifen, schließlich muß jedes Zeichen einzeln verschlüsselt werden. Ist nich besonders aufwendig, kann natürlich geknackt werden, ist aber für meine Zwecke vollkommen ausreichend.
Kompliziertere und somit weitaus sichere Varianten sind natürlich denkbar.
Wenn du magst, schicke ich dir den Code (ca. 20 Zeilen) gern zu.
Gruß
Roland
Die Wege der Bytes sind unerforschlich!
Ewald
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 475
Registriert: Sa, 08. Apr 2006 14:07
Wohnort: Datteln
Danksagung erhalten: 3 Mal
Kontaktdaten:

Beitrag von Ewald »

Hallo Roland,
das Ende der Fahnenstange ist ja für mich erreicht. Leider mußte ich feststellen, dass ich mit crypt() und oem beim Einsatz des ADS am Ende bin. Ich würde deinen Ansatz tatsächlich gerne mal sehen. Wäre schön, wenn keine Zeichen oberhalb von chr(175) dabei rauskommen würden.
Gruß
Ewald
Hans Blum

ANSI Zeichensatz und der Func Crypt

Beitrag von Hans Blum »

Ewald hat geschrieben:Hallo Roland,
das Ende der Fahnenstange ist ja für mich erreicht. Leider mußte ich feststellen, dass ich mit crypt() und oem beim Einsatz des ADS am Ende bin. Ich würde deinen Ansatz tatsächlich gerne mal sehen. Wäre schön, wenn keine Zeichen oberhalb von chr(175) dabei rauskommen würden.
Gruß
Ewald
Hallo Leute, Roland, Ewald usw

Habe das gleiche Problem mit ANSI Zeichensatz und der Func Crypt

Habe eine etwas komplizierte Lösung

da Dbfdbe = SET CHARSET Zeichenwerte werden immer im OEM Zeichensatz gespeichert werden
und bei der FOXDBE -> SET CHARSET Zeichenwerte werden in dem Zeichensatz
gespeichert, der mit SET CHARSET eingestellt ist, wenn eine DBF Datei erzeugt wird
muß man wenn man Crypt()und Ansi benutzen will die Foxdbe benutzen.

Gruß Hans


#include "Common.ch"
#include "DBFDBE.CH"
#include "DMLB.CH"
#include "Xbp.ch"




PROCEDURE main()
LOCAL cfilename := "Hersteller.dbf" // "zubearbeitende.dbf"
LOCAL xdbe := "DBFCDX"
LOCAL Schuessel := "IrgendEinSchlüssel" //schüssel ändern

LOCAL astruct

astruct :=bearbeiteAltedbf( cfilename,"DBFCDX" ,Schuessel)

Erstellneu(cfilename,"FOXCDX",astruct,Schuessel)

RETURN

FUNCTION bearbeiteAltedbf(cfilename,xdbe ,cPass)
LOCAL aStructure :={}
LOCAL narea
LOCAL cfileDBT := StrTran (Lower(cfilename),".dbf", ".dbt") // "Hersteller.dbT"

FIELD BENUTZER ,PASSWORT // Alte zu ersetzende Felder

SET Charset TO oem

IF FileOpen(cFilename ,xDBE)
AltD()
narea := SELECT()
AltD()


IF (nArea)-> ( FieldPos( "CBENUTZER" )) == 0 //feld nicht vorhanden
aStructure := DbStruct() // Datei-Struktur einlesen
(narea)->(DbCloseArea()) // CLOSE
// Feld für BENUTZER CPASSWORT
AAdd( aStructure, {"CBENUTZER","C",25,0} ) // Felder ändern
AAdd( aStructure, {"CPASSWORT","C",25,0} )

DbCreate("TEMP", aStructure ) // Temporäre Datei mit neuer
// Struktur erzeugen
USE Temp // und öffnen
APPEND FROM (cFilename) // Datensätze von *.DBF
// übernehmen
CLOSE Temp


ERASE (cFilename) // Quell-Datei löschen
RENAME Temp.dbf TO (cFilename) // Temporäre Datei umbenennen

IF File( "TEMP.DBT" ) // Wenn Memo-Datei existiert
ERASE (cfileDBT ) // Alte Datei löschen
RENAME Temp.dbt TO (cfileDBT ) // Temporäre Datei umbenennen
ENDIF

ENDIF //neue Felder End
ENDIF //Fileopen End

IF ! Used()
FileOpen(cFilename ,xDBE)
nArea:= SELECT()
ENDIF

(nArea) ->(DbGoTop())
DO WHILE !(nArea) ->( Eof())
IF ! Empty ((nArea) -> Benutzer)
IF RLock()
REPLACE (nArea) ->CBENUTZER WITH crypt(Trim((nArea) ->BENUTZER),cpass)
REPLACE (nArea) ->CPASSWORT WITH crypt(Trim((nArea) ->PASSWORT),cpass)
DbUnlock()
ENDIF
ENDIF
(nArea) ->(DbSkip())

ENDDO

RETURN (aStructure)

/////////////////////////////////////////////////////////////////////

PROCEDURE Erstellneu ( cfilename,xDBE,astructure,cpass) //,"FOXCDX"
LOCAL nArea, i
LOCAL cfileDbT := StrTran (Lower(cfilename),".dbf",".dbt")

SET charset TO ansi

Default xDBE TO "DBFcdx"

DbeInfo( COMPONENT_DATA, DBFDBE_ANSI, .t. )
DbCreate( "Temp1.dbf",astructure, xDBE )
USE (cfilename) via "DBFCDX" new


USE ("Temp1.dbf") via (xDBE) new
nArea := SELECT()
APPEND FROM (cFilename) // leider mit Hersteller OEM Zeichensatz


(nArea) ->(DbGoTop())
DO WHILE !(nArea) ->( Eof())
IF ! Empty ((nArea) -> cBenutzer)
IF RLock()
REPLACE (nArea) ->BENUTZER WITH crypt(Trim((nArea) ->cBENUTZER),cpass)
REPLACE (nArea) ->PASSWORT WITH crypt(Trim((nArea) ->cPASSWORT),cpass)
DbUnlock()
ENDIF
ENDIF
(nArea) ->(DbSkip())
ENDDO

DbCloseAll()
//und Ersatzfeder löschen cBENUTZER,cPASSWORT
FOR i :=1 TO 2
ADel( astructure,Len(astructure) ) //Letztes // aArray ist: {"A","B","D","E", NIL }
ASize( astructure, Len(astructure)-1 ) // Größe anpassen
NEXT i




DbeInfo( COMPONENT_DATA, DBFDBE_ANSI, .t. )
DbCreate("Temp2.dbf" ,astructure, xDBE )

USE ("Temp1.dbf") via "FOXCDX"
AltD()

USE ("TEMP2.dbf") via "FOXCDX"

APPEND FROM Temp1 VIA "FOXCDX" // <cDbe> // NEU ///Hersteller


IF File (cFilename)
ERASE (cFilename)
ENDIF
IF File (cfileDbT)
ERASE (cfileDbT)
ENDIF

IF File ("Temp1.DBF")
ERASE Temp1.DBF // Alte Datei löschen
ENDIF
IF File ("Temp1.FPT")
ERASE Temp1.FPT // Quell-Datei löschen
ENDIF
AltD()
DbCloseAll()
RENAME ("Temp2.dbf") TO (Upper(cFilename)) // Temporäre Datei umbenennen

IF File( "TEMP2.FPT" ) // Wenn Memo-Datei existiert
cfileDbT := Upper( StrTran (Lower(cfilename),".dbf",".FPT")) //neuer Name

RENAME ("Temp2.FPT") TO (cfileDbT) // Temporäre Datei umbenennen
ENDIF



RETURN
/////////////////////////////////////////////////////////
// UFS
/////////////////////////////////////////////////////////

FUNCTION FileOpen(cFile,xDBE,cindexFile,nOrder)
LOCAL rc := FALSE
LOCAL nButton := 0
LOCAL nArea := IF (SELECT() =1,0,SELECT())
Default xDBE TO "DBFcdx"
DO WHILE TRUE
DbUseArea(TRUE,xDBE,cFile)
IF Neterr()
nButton := ConfirmBox( , ;
" Datei ist gesperrt!;Zugriff wiederholen?", ;
"Wiederholen ?", ;
XBPMB_YESNO , ;
XBPMB_QUESTION+XBPMB_APPMODAL+XBPMB_MOVEABLE )


ENDIF


EXIT
ENDDO

IF Used() //.and. nArea < SELECT()

rc :=TRUE

// DbSetIndex (cIdxFile)
// ordsetfocus(norder)
ENDIF
RETURN (rc)

/////////////////////////////////////////////////////////////////////////////////////////

/*
* DbeSys() wird bei jedem Programmstart ausgeführt
*/
PROCEDURE dbeSys()

/*
* Anpassung der Sortierfolge
*/
SET COLLATION TO GERMAN

/*
* DBF und NTX Database-Engine werden "hidden" geladen
* und zu der neuen abstrakten DBFNTX Database-Engine verbunden.
*/
IF ! DbeLoad( "DBFDBE", .T.)
Alert( "Database-Engine DBFDBE nicht geladen" , {"OK"} )
ENDIF

IF ! DbeLoad( "NTXDBE", .T.)
Alert( "Database-Engine NTXDBE nicht geladen" , {"OK"} )
ENDIF

IF ! DbeBuild( "DBFNTX", "DBFDBE", "NTXDBE" )
Alert( "DBFNTX Database-Engine;konnte nicht erzeugt werden" , {"OK"} )
ENDIF


// Das gleiche mit DBE und CDX Database-Engine durchführen
/*
IF ! DbeLoad( "DBFDBE", .T.) // Engine f³r DBF-Dateien laden //schon geladen
ALERT( "Database Engine DBFDBE nicht geladen" , {"OK"} )
ENDIF
*/
IF ! DbeLoad( "CDXDBE" , .T.) // Engine f³r CDX-Dateien laden
ALERT( "Database Engine NTXDBE nicht geladen" , {"OK"} )

ENDIF
// Engines f³r Datensatz- und
// Index-Management zusammenf³gen
IF ! DbeBuild( "DBFCDX", "DBFDBE", "CDXDBE" )
ALERT( "Database Engine DBFCDX nicht erzeugt" , {"OK"} )
ENDIF


IF ! DbeLoad( "SDFDBE", .T. ) // SDFDBE "hidden" laden
ALERT( "SDFDBE nicht geladen" , {"OK"} )

ENDIF
// Compound-DBE erzeugen
DbeBuild( "SDFNTX", "SDFDBE", "NTXDBE" )

/*
* Das gleiche mit FOX und CDX Database-Engine durchführen
*/
IF ! DbeLoad( "FOXDBE", .T.)
Alert( "Database-Engine FOXDBE nicht geladen" , {"OK"} )
ENDIF

IF ! DbeBuild( "FOXCDX", "FOXDBE", "CDXDBE" )
Alert( "FOXCDX Database-Engine;konnte nicht erzeugt werden" , {"OK"} )
ENDIF

//- Einfügen der Zeile
DbeInfo(COMPONENT_ORDER,DBE_LOCKMODE,LOCKING_EXTENDED)
// in die Prozedur DBESYS().

DbeSetDefault( "DBFCDX" )

RETURN
Antworten