Frage

Hintergrund

Ich bin der Gestaltung ein System, das für einen Benutzer von statischen Web-Inhalte, die Entwicklung von dynamischen Authentifizierungsschemata ermöglicht. Die Motivation ist zu komplex zu erzeugen, noch empfindliche Web-Inhalte und es große Mengen von vorge erzeugt dann statisch dienen mit Cookie-basierter Authentifizierung anstelle (umkehrbar verschlüsselte Information Embedding), inately vom Web-Server erzwungen. Mit Hilfe einer AEAD-Modus Verschlüsselung primitiv.

Das Problem

Ich brauche IVEC ist und Schlüssel zu erzeugen, die für eine Zeitdauer gültig ist, sagt eine Woche (das aktuelle gültige Paar). und dass die frühere IVECs / Keys gilt auch für etwa 2 Wochen (historisch gültig) und alle mit den historisch gültigen Geheimnissen verschlüsselten Daten werden nur mit dem aktuellen gültigen IVEC / KEY wieder verschlüsselt werden.

Was ich brauche, ist ein deterministisches CSPRNG, dass die Samen einer Zufallszahl und ein Passwort und das kann in einem indizierten Art und Weise 64-Bit- oder 128-Bit-Blöcke von Zahlen erzeugen. Wenn ich eine Woche-since- „1. Januar 1970“ als eines der Index Element meiner hypothetischen CSPRNG verwenden sollte ich in der Lage sein, ein System zu bauen, dass angeboren Tasten ändert sich automatisch wie die Zeit vergeht.

Ansatz Ich erwäge

Jetzt sehe ich nicht eine solche Funktionalität in cryptopp, oder ich weiß jetzt die Terminologie gut genug, und als cryptopp ist die modernste der Verschlüsselungsbibliotheken gibt, habe ich nicht das Vertrauen Ich werde einen anderen finden. Also, wenn ich nicht eine Implementierung da draußen finden kann, sollte ich meine eigene Rolle. Wird eine statische Zeichenfolge Struktur aus den verkettet Daten zu erzeugen und dann Hashing (siehe unten) den Trick?

RIPEMD160 (RandomPreGeneratedFixedNonce: Passphrase: UInt64SinceEpoch: 128BitBlockIndexNumber);

Hinweis: Die Blocknummern zugeordnet werden und eine regelmäßige Struktur haben, so beispielsweise für ein 128-Bit-Digest, die ersten 64-Bits von Block 0 für die Ivec sein, und alle von Elemente 1 für die 128-Bit- Schlüssel.

Ist das ein vernünftiger Ansatz (- d. H, kryptografisch verschlüsselt)?

- edit: Beitrag Kommentar akzeptieren -

Nach einigem Nachdenken habe ich beschlossen, zu fusionieren, was ich ursprünglich das Passwort betrachtet und die Nonce / Salz in einen 16-Byte (cryptographicall stark) Schlüssel, und verwenden Sie die Techniken in den PKCS # 5 herzuzuleiten mehrere zeitbasierte Schlüssel. Es gibt keine Notwendigkeit für ein Salz, wie Paßphrasen werden nicht verwendet.

War es hilfreich?

Lösung

Interessante Frage.

Zuerst Ihre Initial-Vektoren müssen nicht kryptographisch starke Zufall Mengen sein, aber sie sollte eindeutig seine pro-Nachricht. Die IV ist wirklich nur eine Art von Salz Wert, der sicherstellt, dass ähnliche Nachrichten mit dem gleichen Schlüssel verschlüsselt nicht Look ähnlich, wenn sie verschlüsselt sind. Sie können eine beliebige Schnellpseudozufallsgenerator verwenden, um die IV zu erzeugen, und dann senden (vorzugsweise verschlüsselten) zusammen mit den verschlüsselten Daten.

Die Tasten, natürlich, sollte so stark sein, wie Sie sie praktisch machen.

Ihr Vorschlag Hash eine Textzeichenfolge ein Nonce, Passwort enthält, und die Gültigkeit der Daten erscheint mich sehr vernünftig zu sein - es ist im Großen und Ganzen im Einklang mit dem, was von anderem System durchgeführt wird, die ein Passwort verwenden, um einen Schlüssel zu erzeugen. Sie sollten mehr oft Hash - nicht nur einmal - der Schlüssel Generation rechnerisch teuer zu machen (das ist ein größeres Problem für jedermann zu versuchen sein Brute-Force den Schlüssel als es wird für Sie)

.

Sie können auch einen Blick auf dem Schlüsselerzeugungsschema festgelegt in PKCS # 5 (zB bei http://www.faqs.org/rfcs/rfc2898.html ), die in cryptopp als PasswordBasedKeyDerivationFunction umgesetzt wird. Dieser Mechanismus ist bereits weit verbreitet und bekannt als angemessen sicher (beachten Sie, dass PKCS # 5 empfiehlt die Passwort-Daten mindestens 1000 mal Hashing). Sie könnten nur Ihre Gültigkeitsdauer und Indexdaten an das Passwort und die Verwendung PasswordBasedKeyDerivationFunction anhängen, wie es steht.

Sie sagen nicht, was Verschlüsselungsalgorithmus Sie vorschlagen, um die Daten zu verschlüsseln, zu verwenden, aber ich würde vorschlagen, dass Sie etwas weit verbreiteten und bekannten Pick sollte sicher sein ... und insbesondere würde ich vorschlagen, dass Sie verwenden AES. Ich würde auch empfehlen die Verwendung eines der SHA-Funktionen verdauen (vielleicht als eine Eingabe an PasswordBasedKeyDerivationFunction). SHA-2 Strom, aber SHA-1 ist, für die Schlüsselerzeugung Zwecke ausreichend.

Sie sagen auch nicht, was Schlüssellänge Sie zu generieren suchen, aber Sie sollten sich bewusst sein, dass die Menge der Entropie in Ihre Schlüssel auf die Länge des Passworts hängt, die Sie verwenden, und es sei denn, das Passwort ist sehr das wird lange viel kleiner sein als die Schlüssellänge ideal erfordert.

Das schwächste Glied in diesem Schema ist das Passwort selbst, und das ist immer das Niveau der Sicherheit gehen begrenzen Sie achive können. Solange Sie Ihre Daten Salz (wie Sie tun) und der Schlüssel Generation verteuern Brute-Force-Angriffe zu verlangsamen sollten Sie in Ordnung sein.

Andere Tipps

  

Was ich brauche, ist ein deterministisches CSPRNG, dass die Samen einer Zufallszahl und ein Passwort und das kann in einem indizierten Art und Weise 64-Bit- oder 128-Bit-Blöcke von Zahlen erzeugen. Wenn ich eine Woche-since- „1. Januar 1970“ als eines der Index Element meiner hypothetischen CSPRNG verwenden sollte ich in der Lage sein, ein System zu bauen, dass angeboren Schlüssel automatisch ändert, wie die Zeit vergeht.

Nun, ich denken Teil der Lösung ist eine nicht-zeitbasierten Generator. Auf diese Weise, wenn beide Seiten mit dem gleichen Samen beginnen, dann sie beide produzieren den gleichen Zufallsstrom. Sie können Ihre „Wochen seit Woche 1, 1970“ Logik obendrein.

Schicht

Um das zu tun, würden Sie OFB_mode<T>::Encryption verwenden. Es kann als Generator verwendet werden, da OFB-Modus verwendet AdditiveCipherTemplate<T>, die ergibt sich aus RandomNumberGenerator.

In der Tat verwendet Crpyto ++ den Generator in test.cpp so dass die Ergebnisse wiedergegeben werden können, wenn etwas schiefgeht. Hier ist, wie Sie OFB_mode<T>::Encryption verwenden würden. Sie gilt auch für CTR_Mode<T>::Encryption:

SecByteBlock seed(32 + 16);
OS_GenerateRandomBlock(false, seed, seed.size());

for(unsigned int i = 0; i < 10; i++)
{
    OFB_Mode<AES>::Encryption prng;
    prng.SetKeyWithIV(seed, 32, seed + 32, 16);

    SecByteBlock t(16);
    prng.GenerateBlock(t, t.size());

    string s;
    HexEncoder hex(new StringSink(s));

    hex.Put(t, t.size());
    hex.MessageEnd();

    cout << "Random: " << s << endl;
}

Der Aufruf von OS_GenerateRandomBlock Fetches Bytes von /dev/{u|s}random und verwendet dann die als simulierten gemeinsamen Samen. Jeder Lauf des Programms wird anders sein. Innerhalb jeder Lauf des Programms, druckt er ähnlich dem folgenden:

$ ./cryptopp-test.exe
Random: DF3D3F8E8A21C39C0871B375013AA2CD
Random: DF3D3F8E8A21C39C0871B375013AA2CD
Random: DF3D3F8E8A21C39C0871B375013AA2CD
Random: DF3D3F8E8A21C39C0871B375013AA2CD
Random: DF3D3F8E8A21C39C0871B375013AA2CD
Random: DF3D3F8E8A21C39C0871B375013AA2CD
Random: DF3D3F8E8A21C39C0871B375013AA2CD
Random: DF3D3F8E8A21C39C0871B375013AA2CD
Random: DF3D3F8E8A21C39C0871B375013AA2CD
Random: DF3D3F8E8A21C39C0871B375013AA2CD

Es gibt einen weiteren Generator zur Verfügung, die das gleiche tut, aber es ist nicht Teil der Crypto ++ Bibliothek. Seine genannt AES_RNG und sein basierend auf AES-256. Es ist ein Header nur Implementierung, und Sie können es an der Crypto ++ finden Wiki unter RandomNumberGenerator .

Siehe auch das Thema Reproduzierbarkeit RandomNumberGenerator Klasse auf dem Wiki ++ Crypto.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top