Einzelnen Beitrag anzeigen

Benutzerbild von negaH
negaH

Registriert seit: 25. Jun 2003
Ort: Thüringen
2.950 Beiträge
 

Re: Sicherheit von RC4

  Alt 26. Nov 2007, 12:26
MD5 erzeugt einen 128 Bit Output == 16 Bytes !!
Ergo ist es die beste Wahl den Password-Salt ebenfalls exakt 128 Bit groß zu machen. Mehr an Saltbits lohnen nicht da sie keine höhere Sicherheit im Gesamtsystem mit dem MD5 ergeben, weniger Saltbits würden den Salt zum Angriffsziel einer Attacke machen da deren Sicherheit geringer als die der des MD5 ist, also exakt 128 Bit sind am besten. Wichtig ist das auch dieser Zufall auf sichere Weise erzeugt wurde. Das bedeutet du kannst mit der RCxRandomString() Funktion solchen sicheren Zufall erzeugen wenn der Seed für diesen RNG "unpredictable" also unvorhersagbar für den Angreifer ist. Das könnten zb. Maus/Keyboard Eingaben eines Menschen sein, oder man erzeugt über den Temporary Internet Files Ordner eine Hashprüfsumme der darin enthaltenen Dateien, oder man holt sich aus dem INet von speziellen Servern erzeugten Zufall aus Atomaren Zerfalls-RNGs (ist sehr einfaches Protokoll).
Als Hash Algorithmus benutzt man eine KDF->Key Derivation Function -> Schlüsselableitungsfunktion. Schau mal im DEC bei THash.KDF1() und THash.KDFx(). Die KDF1 ist nach IEEE Standard implementiert, die KDFx ist von mir entwickelt und sollte besser sein. Also einfach nur Salt + Password hashen geht zwar auch wird aber nicht empfohlen. Eine KDF geht da besser vor weil sie

1.) den Hash sequientiell mehrmach nacheinander berechnet
2.) in jeder Teilberechnung imer nur einen Teil des Hashoutputs in das Resultat einrechnet
3.) der Output exakt auf die Länge an benötigten Schlüsselbits für den Cipher berechnet wird

Man zieht also zb. 1000 mal den Hash vom Hash vom Hash... vom Salt+Password und errechnet aus den teilberechnungen das Resultat. Das bedeutet ein Angreifer muß ebenfalls pro Brute Force Atacke 1000 mal den Hash anwerfen -> ergo Komplexitätssteigerung des Angriffes um Faktor x1000.
Punkt 3.) oben ist ebenfalls wichtig. Mit einer KDF erzeugt man also aus einem beliebigen Password+Salt (Salt minimal so lang wie Password) einen Output der exakt so groß ist wie das größt möglich verwendbare Password der Verschlüsselung. Man erzeugt also exakt so viel Schlüsselbits wie der Cipher benötigt.

In DEC ist das alles sehr einfach:

Delphi-Quellcode:
Salt := RandomBinary(16);
with TCipher_Rijndael.Create do
try
  Mode := cmCBC8;
  Init(THash_SHA1.KDFx(Password, Salt, Context.KeySize));
  Result := TFormat_HEX.Encode(Salt) + EncodeBinary('Deine Daten hier', TFormat_HEX);
finally
  Free;
end;
RCx in der CodeLib -> http://www.delphipraxis.net/internal...=353886#353886

Gruß Hagen
  Mit Zitat antworten Zitat