Immer wieder verschlüsseln (zufälliges Auffüllen + const int32) - Geheimnis kompromittieren?
Erlaubt es mir ein Verschlüsselungsschema, dieselbe Ganzzahl sicher wiederholt zu verschlüsseln, wobei jedes Mal ein anderes zufälliges Material vorangestellt wird? Es scheint die Art von Operation zu sein, die mich in heißes Wasser bringen könnte.
Ich möchte das Spinnen von Elementen in meiner Webanwendung verhindern, habe jedoch weiterhin beständige Element-IDs / URLs, damit Inhaltslinks nicht mit der Zeit verfallen. Meine Sicherheitsanforderungen sind dafür nicht wirklich hoch, aber ich würde lieber nichts völlig Schwachsinniges tun, das offensichtlich das Geheimnis aufs Spiel setzt.
// performed on each ID before transmitting item search results to the client
public int64 encryptWithRandomPadding(int32 id) {
int32 randomPadding = getNextRandomInt32();
return encrypt(((int64)randomPadding << 32) + id), SECRET);
}
// performed on an encrypted/padded ID for which the client requests details
public int32 decryptAndRemoveRandomPadding(int64 idToDecrypt) {
int64 idWithPadding = decrypt(idToDecrypt, SECRET);
return (int32)idWithPadding;
}
static readonly string SECRET = "thesecret";
Generierte IDs / URLs sind permanent, die verschlüsselten IDs sind dünn besetzt (weniger als 1 in uint32.Max sind eindeutig, und ich könnte eine weitere konstante Auffüllung hinzufügen, um die Wahrscheinlichkeit einer vorhandenen Vermutung zu verringern), und der Client kann dieselbe Suche ausführen und Sie erhalten jedes Mal die gleichen Ergebnisse mit unterschiedlichen repräsentativen IDs. Ich denke, es entspricht meinen Anforderungen, es sei denn, es liegt ein offensichtliches kryptografisches Problem vor.
Beispiel:
encrypt(rndA + item1) -> tokenA
encrypt(rndB + item1) -> tokenB
encrypt(rndC + item2) -> tokenC
encrypt(rndD + item175) -> tokenD
Hier gibt es keine Möglichkeit zu identifizieren, dass TokenA und TokenB auf identische Elemente verweisen. Dies verhindert, dass eine Spinne doppelte Suchergebnisse entfernt, ohne sie abzurufen (während das Abrufen den Nutzungszähler erhöht). Darüber hinaus ist Element2 möglicherweise nicht vorhanden.
In dem Wissen, dass das erneute Ausführen einer Suche dasselbe int32 zurückgibt, das auf mehrere Arten mit demselben Geheimnis aufgefüllt wurde,kann ich das sicher mit allen gängigen Krypto-Algorithmen machen? Danke, Krypto-Experten!
hinweis: dies ist eine folge zu einer frage, die nicht wie erhofft geklappt hat:Verschlüsseln Sie eine Ganzzahl mit einem geheimen und gemeinsam genutzten Salt