![]() |
Umstellung DEC 3.0 auf 5.2
Hallo!
Wir haben einige DCOM-Server die ihre DB-Anmeldedaten aus der Windows Registratur holen. Das Passwort wird verschlüsselt dort hinterlegt. Mit folgendem DEC 3.0 Code wird das Passwort entschlüsselt:
Delphi-Quellcode:
Nun habe ich schon erfahren, dass es nicht gut war diese Komponenten zu verwenden, da sie nur zu Testzwecken gedacht waren. Leider ist es damals so gemacht worden.
// cm ist TCipherManager mit THashManager
cm.InitKey(KEY, nil); pw := cm.DecodeString(passwort); Als Properties wurden die Standardeinstellungen genommen. HashManager.Algorithm: Ripe Message Digest 256 CipherManager.Algorithm: Blowfish CipherManager.Mode: cmCTS Jetzt versuche ich das umzustellen auf DEC 5.2 und habe dabei schon einige Möglichkeiten durchprobiert, die alle nicht das gewünschte Resultat brachten. Ich möchte vermeiden, bei den Kunden die ganzen Passwörter neu verschlüsseln zu müssen und / oder unterschiedliche Verschlüsselungsverfahren je nach Server zu haben.
Delphi-Quellcode:
Was muss ich ändern, damit ich die alten Passwörter entschlüsselt bekomme?
var
CipherClass: TDECCipherClass = TCipher_Blowfish; CipherMode: TCipherMode = cmCTSx; HashClass: TDECHashClass = THash_RipeMD256; function Decode(const aPasswort: string): string; var cipher: TDECCipher; pw: Binary; begin cipher := nil; Result := ''; try cipher := ValidCipher(CipherClass).Create; cipher.Mode := CipherMode; pw := ValidHash(HashClass).CalcBinary(KEY); cipher.Init(pw); Result := cipher.DecodeBinary(aPasswort); finally FreeAndNil(cipher); end; end; Oder ist die gewählte Algorithmus / Mode Kombination inkompatibel zwischen V3.0 und V5.2? Vielen Dank |
Re: Umstellung DEC 3.0 auf 5.2
Hi automatix,
bist Du denn sicher, daß so wie Du es nutzt bei der alten DEC auch der Hash vom Passwort angewendet wurde? Ich kenne leider die DEC 3 nicht mehr so gut, aber wenn das Kennwort direkt als Basis der Verschlüsselung ohne Hash angewendet wird, wäre das eine mögliche Ursache. Zu Deinem Code: Zitat:
1) prüfen, ob in der DEC 3 der Hash oder das Passwort direkt verwendet wird 2) prüfen, in welchem Format die Ausgabe des Hash bzw. Ciphers vorliegt Es kann ja z.B. sein das bei der DEC 3 das Encoding bsp. einen MIME32 oder HEX-Text zurückliefert. Dies wäre dann mit deinem obigen DEC 5.2 Code inkompatibel, hier müsstest Du entsprechend das Encoding anpassen. Ich hätte jetzt fast gesagt, nenn mir mal einen Beispieltext aus der Registry und das Passwort, dann guck ich ob das geht - aber das scheidet wohl aus wegen gewisser Sicherheitsaspekte ;) Gruß Assertor P.S.: Zusätzlich kannst Du schon den Code für D2009 "vorbereiten" in dem Du - ähnlich meinem DEC 5.2 Beispiel - Length(aPasswort) * SizeOf(aPasswort[1]) nutzt. Dann kommt bei einer Umstellung der Code auch mit der geänderten Größe der Chars klar. |
Re: Umstellung DEC 3.0 auf 5.2
Zitat:
Zitat:
egal, ob Du etwas wie Hash('abc',3) or Hash('abc', 6) berechnest. Ich hoffe, daß diese Unicode-String=Default-Desaster endlich dazu führt, daß man Byte- oder Bitstring bei Hashalgorithmen verwenden, denn dafür sind ja geschrieben. Gruß Gammatester |
Re: Umstellung DEC 3.0 auf 5.2
Inzwischen denke ich, daß ich mich durch Assertors Beitrag habe verwirren lassen, der automatix' KEY durch aPasswort ersetzt hat. D.h. mein Kommentar zu automatix ist hinfällig in dem Sinn, das seine Passwörter durchaus ver/entschlüsselt werden, mit einem KEY (nicht aPasswort, darauf hatte ich mich bezogen).
Die Frage hängt u.a. davon ab, was KEY eigentlich ist. Wenn's vorher ein (ansi-)String war und jetzt ein (Unicode-)String, ist das Problem offensichtlich. Wenn eine array of byte oder ähnliches ist, müßte man mehr wissen. Gammatester |
Re: Umstellung DEC 3.0 auf 5.2
Hi gammatester,
Zitat:
Zitat:
Zitat:
Zitat:
1) Stand es nicht OHNE Grund unter post scriptum... Ich rede von Code-Portabilität falls der TE mal auf D2009 wechseln will. Ist ja nicht so unwahrscheinlich derzeit. Das hat nichts, aber auch garnichts mit dem aktuellen obigen Code zu tun... 2) Das DEC 5.2 arbeitet an RawByteStrings - rate mal, ob das ein "Byte- oder Bitstring" ist Gruß Assertor Edit: Das mit dem Key stimmt natürlich. Ich hatte den Code nur überflogen. Aber Unrecht hast Du mit dem Textkonversionen - wenn die Eingabedaten in einem anderen als dem erwarteten Format kommen, kann es nichts werden. Bleibt die Frage, ob der Hash wirklich im alten DEC genutzt wird oder das Passwort direkt zur Ver/Entschlüsselung kommt (ja, das wäre nicht schön). Edit2: Jetzt wurde soviel editiert, der rote Kasten fehlte auch. Am besten wir starten den Thread nochmal neu ;) Neuer Fakt: Alle haben recht und alle liegen richtig. Der obigen KEY != aPasswort als Fkt.Parameter war falsch - das kommt vom Überfliegen. Die Textkonversionen bleiben aber wichtig. P.S.: @gammatester: Das war ein lustiges Chaos ;) :dp: |
Re: Umstellung DEC 3.0 auf 5.2
Hallo!
Erstmal vielen Dank für das Chaos. :) Ja, der Parameter aPasswort ist das verschlüsselte Passwort aus der Registratur, KEY der Schlüssel zum ver/entschlüsseln. Ein salt oder weitere Sicherheitsmassnahmen waren in diesem Fall überkandiedelt. Die Passwörter standen vorher im Klartext in der Registratur. Die Rechner stehen gegen unbeaufsichtigten physischen Zugriff geschützt, und auch nur einge Administratoren haben übers Netzwerk Zugriff auf den Rechner, zumal auch die Berechtigungen für jeden hier in der Registratur gespeicherten Benutzer auf der Datenbank auf die tatsächlichen Aktionen des jeweiligen DCOM-Servers beschränkt sind. Ob der Hash in DEC 3.0 angewendet wird, kann ich nicht sagen. Ich denke allerdings schon. Denn in TCipherManager.InitKey wird jedenfalls die HashClass aus dem zugewiesenen HashManager zugewiesen und in TCipher.InitKey wird dann
Delphi-Quellcode:
ausgeführt. Für mich sieht das erstmal so aus, dass der Hash angewendet wird.
procedure TCipher.InitKey(const Key: String; IVector: Pointer);
var I: Integer; begin Hash.Init; Hash.Calc(PChar(Key)^, Length(Key)); Hash.Done; I := Hash.DigestKeySize; if I > FKeySize then I := FKeySize; {generaly will truncate to large Keys} Init(Hash.DigestKey^, I, IVector); EncodeBuffer(Hash.DigestKey^, Hash.DigestKey^, Hash.DigestKeySize); Done; SetFlag(0, True); end; Allerdings fürht auch dies
Delphi-Quellcode:
nicht zum Erfolg.
function Decode(const aPasswort: string): string;
var cipher: TDECCipher; pw: Binary; begin cipher := nil; Result := ''; try cipher := ValidCipher(CipherClass).Create; cipher.Mode := CipherMode; cipher.Init(KEY); Result := cipher.DecodeBinary(aPasswort); finally FreeAndNil(cipher); end; end; Die Umstellung auf DEC 5.2 ist ausgelöst worden durch Delphi 2009, allerdings teste ich im Moment dies hier alles mit Delphi 2007, so das der KEY ein einfacher string ist, wie in der DEC 3.0 Version auch. Wo kann ich noch ansetzen? Vielen Dank |
Re: Umstellung DEC 3.0 auf 5.2
Hi automatix,
ich befürchte cmCTS aus DEC 3 != cmCTSx aus DEC 5. Aus dem Quellcode von DEC 5: Zitat:
Du kannst dies nur prüfen, in dem Du mit dem alten DEC 3 unter z.B. D7 einen Text "test" mit Deinem Key verschlüsselst und das Ergebnis mit der Verschlüsselung mit dem gleichen Key und Text aus DEC 5.2 vergleichst. Da Du keine Zufallsdaten (Salt und Default IV mit n*$FF bei cm <> cmECB) verwendest, ist das Ergebnis der Verschlüsselung bei gleichem Passwort und Eingabetext immer identisch, d.h. wenn Du die Verschlüsselung in D7 mehrmals hintereinander aufrufst und z.B. ein TMemo mit dem Ergebnis befüllst, werden alle verschlüsselten Text gleich lauten. Dies gilt auch für D200x und DEC 5.x. Wenn nun aber das Ergebnis abweicht, bist Du hier in die Falle eines proprietären Block Modes gelaufen. Ich vermute, daß sich hier in DEC 5 damals das Padding in cmCTSx gegenüber cmCTS geändert hat. Als Hilfe böte sich an, den Kunden eine Zwischenversion mit Dx/DEC3 zu liefern, die mittels DEC 3 die Passwörter in der Registry auf einen Standard-Blockmode umstellt. Dieser kann dann auch von der DEC 5 richtig gelesen werden. Alternativen, ohne Zwischenversionen, sind a) Update-Tool welches DEC3 nutzt (um die alten Passwörter zu lesen und in ein DEC 5 taugliches Format zu bringen) oder b) Die Kunden bei der neuen Version einmalig zum neuen Eingeben der DB Passwörter aufzufordern. Welche Block Modes in DEC 3 und 5 identisch sind, kann ich Dir ad hoc leider nicht sagen - ich habe die DEC 3 nicht im Einsatz... Hier hilft aber testen und vergleichen, also einmal die Ergebnisse in D7 mit Blockmode X mit D2007 Blockmode Y vergleichen. Gute Kandidaten wären aber sicherlich: cmOFB/cmOFB8 und cmCFB/cmCFB8. Gruß Assertor |
Re: Umstellung DEC 3.0 auf 5.2
Hallo!
Vielen Dank für Deine Unterstützung, auch für die verschiedenen Vorschläge zur möglichen Umstellung. Leider kann man nicht DEC3.0 und DEC 5.2 so ohne weiteres im selben Projekt verwenden. Also habe ich mit Delphi 2006 ein Testprogramm erstellt mit DEC 3.0 und eines mit Delphi 2007 und DEC 5.2. Im Ergebnis sieht es erstmal so aus, dass mir der CipherManager oder HashManager in die Suppe spuckt. Mit folgenden Routinen habe ich mir ein Memo gefüllt für alle möglichen Modi. Delphi 2006 und DEC 3.0
Delphi-Quellcode:
Delphi 2007 und DEC 5.2
procedure TfrmStart.AddEncryptedPassword(aMode: TCipherMode);
var cipher: TCipher_Blowfish; hash: THash_RipeMD256; initHash: string; pw: string; begin cipher := nil; try hash := THash_RipeMD256.Create(nil); cipher := TCipher_Blowfish.Create(MASTER_KEY, hash); cipher.Mode := aMode; pw := cipher.EncodeString(ePasswort.Text); memoErgebnis.Lines.Add(ePasswort.Text + '=' + pw); finally FreeAndNil(cipher); end; end;
Delphi-Quellcode:
Verschlüsselte Paßwörter:
var
CipherClass: TDECCipherClass = TCipher_Blowfish; HashClass: TDECHashClass = THash_RipeMD256; procedure TfrmStart.AddEncryptedPassword(aMode: TCipherMode); var cipher: TDECCipher; initHash: string; pw: Binary; begin cipher := nil; try cipher := ValidCipher(CipherClass).Create; cipher.Mode := aMode; initHash := ValidHash(HashClass).CalcBinary(MASTER_KEY); cipher.Init(initHash); pw := cipher.EncodeBinary(ePasswort.Text); memoErgebnis.Lines.Add(ePasswort.Text + '=' + pw); finally FreeAndNil(cipher); end; end;
Delphi-Quellcode:
Aber alle (DEC 3.0 und DEC 5.2) ungleich:
DEC 3.0 DEC 5.2
cmCTS = cmCTSx cmCBC = cmCBCx cmCFB = cmCFB8 cmOFB = cmOFB8 cmECB = cmECBx
Delphi-Quellcode:
Der CipherManager oder HashManager scheint irgend etwas noch aufzufüllen, denn die verschlüsselten Resultate sind bei einem 8 Zeichen langen Paßwort alle 8 Zeichen lang, mit dem CipherManager/HashManager aber 12 Zeichen.
CipherManagerTest.InitKey(MASTER_KEY, nil);
pw := cmTest.EncodeString(ePasswort.Text); Ich werde mit jetzt nochmal den CipherManager und HashManager zur Brust nehmen. Wenn jemand (Assertor ?) noch eine Idee hat oder einen Geistesblitz nach dem Motto: "Ach ja, das liegt daran", bitte her damit. Grüße |
Re: Umstellung DEC 3.0 auf 5.2
Hi
du musst zwingend umstellen ? Wenn ja wird es hart. Es haben sie einige und wesentliche Änderungen vom DEC 3 zum DEC 5 ergeben und das sind ne Menge. 1.) .InitKey() und .Init() der Cipher sind nicht direkt kompatibel 2.) einige Hash Funktionen haben sich geändert, dürfte aber in diesem Falle nicht relevant sein 3.) die Cipher Modis sind komplett neu, den alten cmCTS gibts in der Form nicht mehr Man muß 1.) die per HashManager benutzt Routine um ein Plainkey in einen Sessionkey umzuwandeln reimplementieren in DEC5 2.) die Funktionalität von .InitKey() aus DEC 3 in DEC 5 reimplementieren, das geht mit der Methode .Init() zu Fuß 3.) in DEC5s .Init() Methode ist die Überprüfung der übergeben Keys strenger, du musst also zu lange Keys schon vor der Übergabe an .init() beschneiden da ansonsten diese Methode einen Fehler meldet. In DEC3 war es so das stillschweigend das zu lange Keymaterial beschnitten wurde. In DEC 5 ist der Mode cmCTSx kompatibel zu cmCTS aus DEC 3. Tut mir ja leid aber mit neuem Wissen wird man in neueren Versionen eben auch Fehler der alten Versionen beseitigen, und das führt in diesem Fall zur Inkompatibilität. Gruß Hagen |
Re: Umstellung DEC 3.0 auf 5.2
Hallo Hagen,
Danke fürs klären! Ich war gerade schon am Wühlen im DEC3 Code bevor mein Notebook sich leider verabschiedete... Gruß Assertor |
Re: Umstellung DEC 3.0 auf 5.2
Hallo!
Vielen Dank für eure Hilfe. Ich hatte gestern noch ein bischen mit dem Debugger rumgespielt und gehofft, dass es vielleicht mit ein paar Füllbytes getan wäre. Vielen Dank an Dich, Hagen, dass Du mir mit deinen Erleuterungen der Innereien die weitere Suche ersparst. Schade, dass es nicht einfacher ist. Zwingend umstellen muss ich jetzt nicht. Aber wenn ich das erste Projekt auf Delphi 2009 konvertiere will, muss oder ein neues Projekt beginne wird es auf mich zukommen. So habe ich jetzt noch die Zeit mir einen Schlachtplan zu überlegen. An den Clients der DCOM-Server hängt nämlich fast 24x7 Produktion dran und es ist nicht so einfach möglich da zwischendurch eine neue Version des Servers einzuspielen. Änderungen / Erweiterungen erfolgen aber hin und wieder. Ich denke, ich werde jetzt eine Funktion implementieren, die das aus der Registratur gelesene verschlüsselte Passwort mittels DEC 3.0 einmal mit und einmal ohne CipherManager/HashManager entschlüsselt. Dann probiere ich die Datenbankanmeldung mit dem ohne CipherManager/HashManager entschlüsselten Passwort. Funktioniert das, dann ist es ok. Ansonsten nehme ich das mit CipherManager/HashManager entschlüsselte, verschlüssele es ohne CipherManager/HashManager und schreibe es in die Registratur. Somit sollte ich über kurz oder lang alle Passwörter DEC 5.2 kompatible in der Registratur haben. Oder gibt es eine andere Möglichkeit zu erkennen ob das Passwort mit oder ohne CipherManager/HashManager verschlüsselt wurde? Grüße |
Re: Umstellung DEC 3.0 auf 5.2
Hi automatix,
Zitat:
Ist es nicht da, weißt Du, daß es noch DEC3 ist, ist es da, entschlüsselst Du alles nach dem Prefix mit DEC5. Muß ja keine Textfolge sein, kann ja auch ein kleiner - eindeutige Binärfolge sein. Oder alternativ ein zweiter Registry Schlüssel, der für die neuen Passwörter ist. Gibt es den alten Registry Schlüssel, ist es DEC 3 beim neuen halt DEC 5. Gruß Assertor |
Re: Umstellung DEC 3.0 auf 5.2
Zitat:
Gruß hagen |
Re: Umstellung DEC 3.0 auf 5.2
Zitat:
Gruß Assertor |
Re: Umstellung DEC 3.0 auf 5.2
Hallo!
Ich verwende die hier ![]() Zitat:
Also doch worst worst case. :( Grüße |
Re: Umstellung DEC 3.0 auf 5.2
Zitat:
Gruß Hagen |
Re: Umstellung DEC 3.0 auf 5.2
Hi Hagen,
Zitat:
Zitat:
Gruß Assertor |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:02 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz