毎回異なるランダムな素材を前に付けて、同じ整数を繰り返し暗号化することを安全に許可する暗号化スキームはありますか? 湯に浸かりそうな手術のようです。
Web アプリケーションでのアイテムのスパイダリングを防止したいが、永続的なアイテム ID/URL を保持して、コンテンツ リンクが期限切れにならないようにしたい。これに対する私のセキュリティ要件はそれほど高くありませんが、秘密を明らかに侵害する完全にばかげたことはしたくありません。
// 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";
生成された ID/URL は永続的であり、暗号化された ID はまばらに読み込まれます (uint32.Max の 1 未満は一意であり、既存の推測の可能性を減らすために別の一定のパディングを追加できます)、クライアントは同じ検索を実行し、毎回異なる代表 ID で同じ結果が得られます。露骨な暗号化の問題がない限り、それは私の要件を満たしていると思います。
例:
encrypt(rndA + item1) -> tokenA
encrypt(rndB + item1) -> tokenB
encrypt(rndC + item2) -> tokenC
encrypt(rndD + item175) -> tokenD
ここでは、tokenA と tokenB の両方が同じ項目を指していることを識別する方法はありません。これにより、スパイダーが重複した検索結果を取得せずに削除するのを防ぎます (取得すると使用量メーターが増加します)。さらに、item2 が存在しない場合があります。
検索を再実行すると、同じシークレットで複数の方法が埋め込まれた同じ int32 が返されることがわかっている場合、一般的な暗号アルゴリズムでこれを安全に実行できますか? ありがとう、暗号の専門家!
注:これは、私が望んでいたようにうまくいかなかった質問へのフォローアップです:シークレットと共有ソルトで整数を暗号化する