AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

DEC 6.0 Salzstreuer

Ein Thema von Klapauzius · begonnen am 22. Dez 2020 · letzter Beitrag vom 22. Dez 2020
Antwort Antwort
Seite 1 von 2  1 2      
Rollo62

Registriert seit: 15. Mär 2007
4.167 Beiträge
 
Delphi 12 Athens
 
#1

AW: DEC 6.0 Salzstreuer

  Alt 22. Dez 2020, 09:23
Salt:= Random(16); Kann es sein das Du beim Verschlüsseln und Entschlüsseln verschiedenes "Salze" benutzt ?
Versuche mal statt "Random", einfach einen festen Wert zu nehmen.
Ausserdem würde ich für Salt nicht nur ein Integer nehmen, sondern eine längere Zeichenfolge.
  Mit Zitat antworten Zitat
Andreas13

Registriert seit: 14. Okt 2006
Ort: Nürnberg
721 Beiträge
 
Delphi XE5 Professional
 
#2

AW: DEC 6.0 Salzstreuer

  Alt 22. Dez 2020, 09:29
Vielleicht mußt Du vor dem Aufruf von Salt:= Random(16); den Zufallszahlengenerator durch Randomize zurücksetzen, um das geleiche "Salz" zu erhalten.
Gruß, Andreas
Grüße, Andreas
Wenn man seinem Nächsten einen steilen Berg hinaufhilft, kommt man selbst dem Gipfel näher. (John C. Cornelius)
  Mit Zitat antworten Zitat
samso

Registriert seit: 29. Mär 2009
439 Beiträge
 
#3

AW: DEC 6.0 Salzstreuer

  Alt 22. Dez 2020, 09:52
@Andreas13:
Randomize setzt den Zufallsgenerator nicht zurück, sondern setzt einen neuen -mehr oder weniger- zufälligen Startwert. Nach Ausführen von Randomize ist der erste Wert Random(16) also nicht fixed.
  Mit Zitat antworten Zitat
Andreas13

Registriert seit: 14. Okt 2006
Ort: Nürnberg
721 Beiträge
 
Delphi XE5 Professional
 
#4

AW: DEC 6.0 Salzstreuer

  Alt 22. Dez 2020, 12:34
@Andreas13:
Randomize setzt den Zufallsgenerator nicht zurück, sondern setzt einen neuen -mehr oder weniger- zufälligen Startwert. Nach Ausführen von Randomize ist der erste Wert Random(16) also nicht fixed.
Sorry, Du hast recht Samso!
Grüße, Andreas
Wenn man seinem Nächsten einen steilen Berg hinaufhilft, kommt man selbst dem Gipfel näher. (John C. Cornelius)
  Mit Zitat antworten Zitat
Klapauzius

Registriert seit: 8. Feb 2018
Ort: Region Bern (Schweiz)
74 Beiträge
 
Delphi 12 Athens
 
#5

AW: DEC 6.0 Salzstreuer

  Alt 22. Dez 2020, 13:01
Das Prinzip von Salt habe ich nun verstanden.

Bleibt noch meine Frage:
wie erzeuge ich dann unterschiedliche Resultate bei der Stringverschlüsselung, wenn gleicher Text und gleiches Passwort verwendet wird (analog zu Lockbox)?
Albert
  Mit Zitat antworten Zitat
Bbommel

Registriert seit: 27. Jun 2007
Ort: Köln
669 Beiträge
 
Delphi 12 Athens
 
#6

AW: DEC 6.0 Salzstreuer

  Alt 22. Dez 2020, 13:54
Das Prinzip von Salt habe ich nun verstanden.

Bleibt noch meine Frage:
wie erzeuge ich dann unterschiedliche Resultate bei der Stringverschlüsselung, wenn gleicher Text und gleiches Passwort verwendet wird (analog zu Lockbox)?
Indem du jedes Mal ein anderes Salt verwendest. Das Salt speicherst du zusammen mit dem Passwort in der Datenbank und kannst es somit vor dem Entschlüsseln wieder lesen. Natürlich können dann im Worst Case auch die bösen Jungs das Salt mit auslesen, aber das ist nur begrenzt schlimm, weil es ja vor allem darum geht, es zu erschweren, den Hash zu erraten mit Rainbow-Tabellen und ähnlichem.

Zusätzlich zum Salt kannst du auch noch eine Priese Pepper packen. Das wäre dann eine "geheime" Ergänzung zun Schlüssel, der eben nicht in der Datenbank landet und somit auch jedes Mal gleich ist, aber es somit weiter erschwert, ein Passwort zu erraten.

Siehe auch hier.
  Mit Zitat antworten Zitat
Klapauzius

Registriert seit: 8. Feb 2018
Ort: Region Bern (Schweiz)
74 Beiträge
 
Delphi 12 Athens
 
#7

AW: DEC 6.0 Salzstreuer

  Alt 22. Dez 2020, 14:39
All dies ist mir im Prinzip klar. Wie gesagt, ich hatte ursprüngliche eine andere Vorstellung von Salt, die ich nun korrigiert habe.

Aber:

Textverschlüsselung mit Lockbox erzeugt jedesmal ein anderes Ergebnis (bei gleichem Inhalt und gleichem Passwort) ohne dass etwas irgendwo hinterlegt werden muss. Wie funktioniert dies in Lockbox und wie realisiere ich das allenfalls in DEC

Edit:
Scheinbar suche ich Nonce
Zitat:
Während ein Salt bei Passwörtern zum Erhöhen der Entropie benutzt wird, werden Nonce und Padding in Verschlüsselungsalgorithmen benutzt. Die Nonce dient dabei dazu, die „Einmaligkeit“ eines Klartextes sicherzustellen, so dass sich trotz determinierter Vorgehensweise des Algorithmus der erzeugte Ciphertext unterscheidet, wenn der gleiche Klartext mehrmals verschlüsselt wird. Somit sollte die Nonce auch möglichst zufällig sein.
https://de.wikipedia.org/wiki/Salt_(Kryptologie)
Albert

Geändert von Klapauzius (22. Dez 2020 um 14:47 Uhr)
  Mit Zitat antworten Zitat
Klapauzius

Registriert seit: 8. Feb 2018
Ort: Region Bern (Schweiz)
74 Beiträge
 
Delphi 12 Athens
 
#8

AW: DEC 6.0 Salzstreuer

  Alt 22. Dez 2020, 09:44
@Rollo62 Aufgrund meiner mangelnden Verschlüsselungskenntnissen habe ich also Salt falsch interpretiert. Bis anhin habe ich Lockbox verwendet, wo keine Hintergrundinformationen über Verschlüsselung notwendig sind. Jetzt hat mich einfach stutzig gemacht, dass ich bei Lockbox nie das gleiche Resultat für die Verschlüsselung eines Strings (bei gleichem Passwort) erhalte, bei DEC bleibt das Resultat aber immer gleich. Deshalb dachte ich, dass das Salz verantwortliche wäre für diese unterschiedlichen Resultate bei Lockbox.

Zum Salt random(16): Dies wurde in meinem Code nur als einfache Möglichkeit verwendet um Salt zu testen.

Da ich Salt falsch verstanden habe, meine Frage:
wie erzeuge ich dann unterschiedliche Resultate bei der Verschlüssung, wenn gleicher Text und gleiches Passwort verwendet wird (analog zu Lockbox)?
Albert
  Mit Zitat antworten Zitat
Rollo62

Registriert seit: 15. Mär 2007
4.167 Beiträge
 
Delphi 12 Athens
 
#9

AW: DEC 6.0 Salzstreuer

  Alt 22. Dez 2020, 10:01
Das Salt ist meiner Meinung nach nichts Geheimnisvolles.
Vielleicht sehe ich das zu einfach, aber für mich ist das Salz praktisch nur die Verlängerung des eigentlichen Passwortes um noch ein paar kryptische Daten.
https://code-bude.net/2015/03/30/gru...ing-mit-salts/

Es geht dabei darum dass das Hacken von Passwörten wie "Sabine, MeinPasswort, SehrSicher, Geheim, ..." zu erschweren/verhindern.
Dadurch dass dem simplen User-Passwort noch etwas Salz hinzugefügt wird, wird erreicht
das diese einfachen Wörter dann nicht mehr aus Lookup-Tabellen mittels BruteForce gesucht werden können.
  Mit Zitat antworten Zitat
Klapauzius

Registriert seit: 8. Feb 2018
Ort: Region Bern (Schweiz)
74 Beiträge
 
Delphi 12 Athens
 
#10

AW: DEC 6.0 Salzstreuer

  Alt 22. Dez 2020, 10:52
Danke, dann habe ich Salt jetzt verstanden.

Hier meine Testklasse zur Textverschlüsselung:
Sieht das so sicherheitstechnisch korrekt aus?

Delphi-Quellcode:
unit Unit2;

interface

uses
  System.SysUtils, System.TypInfo, Generics.Collections, FMX.Platform,
  DECCipherBase, DECFormatBase, DECBaseClass, DECFormat, DECCipherModes,
  DECCipherFormats, DECCiphers, DECUtil, DECHashBase, DECHash, DECRandom,
  System.Classes, FMX.Dialogs;

type
  DECEnc = class(TObject)
  private
    Cipher: TCipher_AES;
    FFiller: Byte;
    FIV: TBytes;
    FPassword: UTF8String;
    function GenerateHashedPw: TBytes;
    procedure SetPassword(const Value: UTF8String);

  public
    constructor Create;
    property Password: UTF8String read FPassword write SetPassword;
    destructor Destroy; override;
    function DecryptString(ENC_Base64String: UTF8String): UTF8String;
    function EncryptString(const PlainText: UTF8String): UTF8String;

  end;

implementation
 
constructor DECEnc.Create;
begin
  inherited;
    FIV:= TEncoding.UTF8.GetBytes('2A7Q5!8;');
    RandomBuffer(FFiller,4);
    Cipher:= TCipher_AES.Create;
    Cipher.Mode := cmCBCx;

end;

destructor DECEnc.Destroy;
begin
  cipher.Free;
  inherited;

end;

function DECEnc.DecryptString(ENC_Base64String: UTF8String): UTF8String;
var
 output: TBytes;
 DecodedString: UTF8String;
 input: TBytes;
begin
    Cipher.Init(GenerateHashedPw,FIV,FFiller);
    Input := System.SysUtils.BytesOf(ENC_Base64String);
    output := Cipher.DecodeBytes(TFormat_Base64.decode(Input));
    result:= TEncoding.UTF8.GetString(output);
end;

function DECEnc.EncryptString(const PlainText: UTF8String): UTF8String;
var
  output: utf8String;
  Data:TBytes;
begin
    Cipher.Init(GenerateHashedPw,FIV,FFiller);
    output:= UTF8Encode(Cipher.EncodeStringToString(PlainText, TFormat_BASE64));
    result:= output;
end;

function DECEnc.GenerateHashedPw: TBytes;
var
  Hash: THash_SHA256;
  Salt: utf8string;
  SaltBytes: TBytes;
  PW: TBytes;
  HashedPw: TBytes;
begin
  Salt:= 'wer 9845747 198498 34534';
  Hash:= THash_SHA256.create;
  try
   SaltBytes:= TEncoding.utf8.GetBytes(Salt);
   PW:= TEncoding.utf8.GetBytes(FPassword);
   HashedPw:= Hash.KDF1(PW,SaltBytes,Cipher.Context.KeySize);
   result:= HashedPw;
  finally
     Hash.Free;
  end;

end;

procedure DECEnc.SetPassword(const Value: UTF8String);
begin
  FPassword := Value;
end;

end.
Albert
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21: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