Mein Problem ist folgendes:
In einer bestehenden Datenbank möchte ich Daten in ein paar Spalten verschlüsseln. Die Spalten enthalten Strings unterschiedlicher Länge.
Ich möchte die Größe der Spalten nicht ändern, damit die Verschlüsselung eine Textdarstellung mit gleicher Länge des Eingabetexts erzeugen muss.
Die Stärke des Verschlüsselungsalgorithmus ist von sekundärem Interesse, aber natürlich möchte ich, dass er so stark wie möglich ist. Sonst müsste ich die Daten nicht verschlüsseln. Aber das Wichtigste ist die Größe der Ausgabe.
Ist das möglich? Wenn ja, wie würde ich es tun?
Ich bin daran interessiert, es in .NET zu tun. Keine Verschlüsselung auf Datenbankebene.
In Ihren Konstanten würde ich AES im CFB -Modus verwenden, wodurch es in eine Stream-Chiffre und die Ausgabelänge umgewandelt wird entspricht der eingegebenen Länge. Wenn Sie die Strings nicht in Blobs speichern, müssen Sie die Ausgabe hexadezimieren oder base64 codieren, um sie char-freundlich zu machen, was eine Längenzunahme von 100% oder 33% bedeutet.
Eine .NET-Implementierung ist hier.
Sichere Verschlüsselung erfordert, dass der Chiffretext größer als der Klartext ist; ansonsten ergibt identischer Klartext immer den gleichen Chiffretext, und es gibt keinen ungültigen Chiffretext, beides Schwächen.
Wenn Sie jedoch die Daten, die Sie verschlüsseln, wirklich nicht erweitern können, ist ein optimaler Blockmodus das Beste, was Sie tun können. Suchen Sie nach den XTS- und CMC-Modi, die für die Festplattenverschlüsselung verwendet werden.
Sie sollten sich eine Minute Zeit nehmen und an das eigentliche Problem denken, das Sie lösen wollen. Ich habe sehr wenige Fälle gesehen, in denen Datenbankverschlüsselung wirklich notwendig war, da Informationen selten direkt von der Datenbank zu einem Endbenutzer fließen.
Wenn Sie den Inhalt der Datenbank schützen müssen, sollten Sie sich vielleicht stattdessen die Standard-Zugriffskontrollmechanismen ansehen.
Die Vigenère-Chiffre kann das tun. Aber es ist alt (vor dem Computer) und nur sicher, wenn Ihre Schlüsselphrase länger als die längste Zeichenfolge ist, die Sie verschlüsseln möchten. Wenn Sie eine Datenbank mit Strings haben, die mit dem gleichen Schlüsselwort verschlüsselt sind, wird dies wahrscheinlich eine Wochenverschlüsselung machen, besonders wenn die einfachen Texte erraten werden können.
Es funktioniert mehr oder weniger wie der Cesar-Shift-Algorithmus (fügen Sie n zu jedem Buchstaben im Klartext hinzu), außer dass n für jeden Buchstaben, der geändert wird, basierend auf einem Schlüsselsatz anders ist.
Wenn Ihr Schlüsselsatz ABCDEFG ist, dann bedeutet dies n = 1 für den ersten Buchstaben der Eingabe, 2 für den zweiten Buchstaben der Eingabe usw.
Bei einer zufälligen Schlüsselphrase, die länger ist als der reine Text, ist die Ausgabe genauso zufällig (sicher). Aber ich glaube, das wird scheitern, wenn Sie viele Strings mit dem gleichen Schlüssel verschlüsselt haben. ..
Jede Blockchiffre genügt. Im Wesentlichen geben Sie einen Block fester Länge ein und erhalten einen verschlüsselten Block ähnlicher Größe zurück. Die Chiffre ist eine Permutation von {0, ..., 2 ^ Blocklänge} nach {0, ..., 2 ^ Blocklänge}. (Die Eingabedauer muss bis zu einer Blocklängengrenze aufgefüllt werden.)
Das Problem hierbei ist, dass Sie, wenn es sich bei den Spalten um Text handelt, nicht unbedingt einen binären Cryptotext einfügen und die Daten in ein Textformat wie base64 (33% Größenzunahme) codieren müssen.
AES ist ein Blockchiffre-Standard, der weit verbreitet ist.
Wenn die vorhandenen Spalten idealerweise größer als ein einzelner Block in einer standardmäßigen Blockchiffre sind (16 Byte für AES, 8 Byte für TDES), können Sie in CTS (Chiffre Text Stehlen) Modus . Leider unterstützt .net CTS in keinem der enthaltenen Algorithmen. : - (
Normalerweise verwendet CTS eine zufällige IV, die zusammen mit dem Chiffretext gespeichert werden müsste, aber Sie können einfach die Zeilen-ID oder sogar einen konstanten Wert verwenden, wenn Sie identische Klartextwerte nicht gleich verschlüsseln wollen.
Dies ist normalerweise unmöglich, weil Sie (naiv) erwarten würden, dass die verschlüsselte Zeichenfolge mehr Informationen enthält als der reine Text.
Vage Ideen zur Lösung Ihres Problems:
- Ordnen Sie Ihre Nummer einer kürzeren Textzeichenfolge zu: zwei Ziffern könnten zu einem Zeichen gehören.
- Können Sie vermeiden, die ersten x Ziffern zu verschlüsseln?
- Welche Möglichkeiten gibt es, es als Ganzzahl und nicht als Text zu verschlüsseln?
Sie können nach einer veränderbaren Blockchiffre suchen. Wenn Ihre Zeilen eine eindeutige Kennung (z. B. einen Primärschlüssel) haben, kann die eindeutige Kennung als Optimierung verwendet werden. Der Vorteil dieser Art der Verschlüsselung besteht darin, dass Sie keine IVs benötigen, um die Verschlüsselung zufällig zu gestalten. Auch wenn eine Spalte mehrfach denselben Wert enthält, wird dieser Wert aufgrund der Optimierung anders verschlüsselt.
Eine weniger sichere Lösung besteht darin, im Zählermodus eine Blockchiffre zu verwenden und den eindeutigen Bezeichner zur Berechnung des Zählers zu verwenden. Dieser Modus hat jedoch einen schwerwiegenden Nachteil: Sie können Felder nicht sicher erneut verschlüsseln, wenn Sie nicht auch den eindeutigen Bezeichner ändern.
Da in beiden Fällen der Chiffretext nicht randomisiert wird, kann ein Angreifer beobachten, ob sich ein bestimmtes Feld geändert hat. Dadurch könnten wertvolle Informationen verloren gehen. Beachten Sie auch, dass Ihnen in beiden Fällen keine Datenintegrität zur Verfügung steht. Auch wenn ein Angreifer keine Informationen entschlüsseln kann, kann er dies dennoch zu seinem Vorteil ändern.
Tags und Links .net encryption