![]() |
AW: Shop-Zugangsdaten verschlüsseln
Danke.
|
AW: Shop-Zugangsdaten verschlüsseln
Nichts was ein Class Helper nicht lösen könnte
Delphi-Quellcode:
uses
System.Classes, System.IniFiles, System.SysUtils; type TCustomIniFileHelper = class helper for TCustomIniFile public function ReadBytes( const Section, Name: string ): TBytes; procedure WriteBytes( const Section, Name: string; const Value: TBytes ); end; implementation { TCustomIniFileHelper } function TCustomIniFileHelper.ReadBytes( const Section, Name: string ): TBytes; var stream: TBytesStream; begin stream := TBytesStream.Create( ); try Self.ReadBinaryStream( Section, Name, stream ); Result := stream.Bytes; finally stream.Free( ); end; end; procedure TCustomIniFileHelper.WriteBytes( const Section, Name: string; const Value: TBytes ); var stream: TBytesStream; begin stream := TBytesStream.Create( Value ); try Self.WriteBinaryStream( Section, Name, stream ); finally stream.Free( ); end; end; |
AW: Shop-Zugangsdaten verschlüsseln
*entfernt, ich verstehe TE gerade nicht*
|
AW: Shop-Zugangsdaten verschlüsseln
Tja, Sorry Kathinka, das war für die Katz ;-)
Zitat:
Zitat:
|
AW: Shop-Zugangsdaten verschlüsseln
Vielleicht doch? ...
Den Code habe ich für meine Bedürfnisse erweitert. Ich bin Jetzt auf XE2. Dank Kodezwerg konnte ich das auch da zum Laufen bringen. Bei der ersten Erweiterung geht um Base 64. Als Grundlage nahme ich das Beispiel oben mit "procedure SmallTest( );"
Delphi-Quellcode:
Dazu habe ich einen unit-test gemacht:
uses
... Soap.EncdDecd, ... function EncryptStringToBase64(const S: String): String; var inBuffer, outBuffer, encrypted: TBytes; begin inBuffer := TEncoding.UTF8.GetBytes( S ); encrypted := TProtectedData.Protect( inbuffer ); // verschlüsseln Result := EncodeBase64(encrypted,Length(encrypted)); Result := StringReplace(Result, #13#10, '', [rfReplaceAll]); end; function DecryptBase64ToString(const S: String): String; var outBuffer, encrypted: TBytes; begin encrypted := DecodeBase64(S); outBuffer := TProtectedData.Unprotect( encrypted ); // entschlüsseln Result := TEncoding.UTF8.GetString( outBuffer ); end;
Delphi-Quellcode:
Der läuft gut. Anders sieht es mit dem nächsten aus.
procedure TTest_LoginCrypt.Test_Basic1();
var orginal: String; crypt: String; decrypt: String; begin orginal := 'DesÜsch a Passwörd!'; crypt := EncryptStringToBase64(orginal); decrypt := DecryptBase64ToString(crypt); CheckEquals(orginal, decrypt, 'decrypt'); end;
Delphi-Quellcode:
Beim ersten Mal geht er schief, klar denke ich die Daten passen nicht. Ich kopiere mir die richtigen Daten aus dem Debugger oder unit-test Ergebnis raus. Aber bei jedem Durchlauf werden andere Daten erwartet.
procedure TTest_LoginCrypt.Test_Basic2();
const expected = 'AQAAANCMnd8BFdERjHoAwE/Cl+sBAAAAR6WMUwdNMUWKnnyFGb2XNAAAAAACAAAAAAAQZgAAAAEAACAAAAB54/kNaa'+ 'FIZe84QZZTmPvuZ9asbR6NoCsGdTGhpYDS4AAAAAAOgAAAAAIAACAAAAD44yDX7VmMRv6NO3Sf1fBdJXAd6YmB1HRb'+ '75aqGm1XCyAAAAAx+BMspmyEA9ymHt02gmt60xXA0JRYzzEtQirpBUSGvUAAAADD6HkiNivbUlSN1LW8293Bq7ktHA'+ 'ca7+3zscNrTPbfqo7zg/cQZLFhIPHVaW8Gqp+fsa9Nx3p4u/XRI0EdsT1n'; var orginal: String; crypt: String; decrypt: String; begin orginal := 'DesÜsch a Passwörd!'; crypt := EncryptStringToBase64(orginal); CheckEquals(expected, crypt, 'crypt'); decrypt := DecryptBase64ToString(crypt); CheckEquals(orginal, decrypt, 'decrypt'); end; Wo ist mein Denkfehler? |
AW: Shop-Zugangsdaten verschlüsseln
Weil bei jedem Protect mit einem zusätzlichen (zufälligem) Salt verschlüsselt wird (macht die API von selber). Dadurch ist die Verschlüsselte Code-Folge immer unterschiedlich auch wenn die zu verschlüsselnden Daten gleich sind.
|
AW: Shop-Zugangsdaten verschlüsseln
Zitat:
Ich nutze sowas hier, ich wollte es ursprünglich auch als noch zwei weitere Helfer posten, aber ich kam mit Deinem Text nicht so ganz klar. Hier ist mein Base64 Kompromiss der keine Speziellen Units braucht. Ob schneller oder langsamer als andere kann ich nicht sagen, habs noch nicht gebencht.
Delphi-Quellcode:
const
Codes64 = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz+/'; function Encode64(S: string): string; var i: Integer; a: Integer; x: Integer; b: Integer; begin Result := ''; a := 0; b := 0; for i := 1 to Length(s) do begin x := Ord(s[i]); b := b * 256 + x; a := a + 8; while a >= 6 do begin a := a - 6; x := b div (1 shl a); b := b mod (1 shl a); Result := Result + Codes64[x + 1]; end; end; if a > 0 then begin x := b shl (6 - a); Result := Result + Codes64[x + 1]; end; end; function Decode64(S: string): string; var i: Integer; a: Integer; x: Integer; b: Integer; begin Result := ''; a := 0; b := 0; for i := 1 to Length(s) do begin x := Pos(s[i], codes64) - 1; if x >= 0 then begin b := b * 64 + x; a := a + 6; if a >= 8 then begin a := a - 8; x := b shr a; b := b mod (1 shl a); x := x mod 256; Result := Result + chr(x); end; end else Exit; end; end; |
AW: Shop-Zugangsdaten verschlüsseln
Zitat:
|
AW: Shop-Zugangsdaten verschlüsseln
Zitat:
|
AW: Shop-Zugangsdaten verschlüsseln
Zitat:
Trotz allem bekommt man bei gleichen Eingangswerten beim Protect immer unterschiedliche Byte-Folgen zurück |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:24 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-2025 by Thomas Breitkreuz