0

私は独自のリスト マネージャーを作成しており、ユーザーが "ワンクリック" で購読を解除できるようにするための簡単な短い URL が必要です (例: http://unsubscribe.example.com/50d178fa )。

50d178faは単なる 16 進数のエポックであり、私が考えるのが好きすぎる推測です。1 つは悪意のあるもので、一定期間 16 進数を正しく推測することで人々の登録を解除する可能性があります。

だから私はいくつかの光の保護を探しています。xor最も単純なようです。欠落している可能性のある8文字を超えない「推測できない文字列」を生成するシークレットを使用した、他の「サックレス」の提案はありますか?

    epoch=$(date +%s)
    hex=$(printf '%x' $epoch)
    echo Convert epoch to hex
    echo d:$epoch h:$hex

    echo h:$hex is ${#hex} characters long

    echo Conversion from hex back to epoch
    echo h:$hex d:$(printf "%dn" 0x$hex)

    n=911 # secret number

    obfuscated=$(($epoch ^ $n))
    obfuscatedhex=$(printf '%x' $obfuscated)
    echo d:$obfuscated, h:$obfuscatedhex is ${#obfuscatedhex} characters long
    echo Conversion from hex back to epoch
    echo $(($(printf "%dn" 0x$obfuscatedhex) ^ $n))
4

1 に答える 1

2
head -c 4 /dev/urandom | xxd -p

拡張すると、毎回同じものに対して xor を実行する場合、xor は難読化にはあまり適していません。誰かがこれらのリンクの例をいくつか取得すると、 、 、 、 for 、 、および が得られますa ^ n(b ^ nしたがってc ^ na通常bc最後の数ビットのみが異なります)。(a ^ n) ^ (b ^ n)= (a ^ b) ^ (n ^ n)=を計算できます。これにより、 と の間で(a ^ b)異なるビットだけが表示されます。彼らが同じことをするならabcどちらの場合も、それぞれのケースで異なるのは下位ビットだけであることがわかります。そのため、彼らは持っている値を取得し、下位ビットを反転して推測を開始できます。秘密に対する xor は、値を推測しようとする誰かから実際にあなたを保護するものではありません。いくつかの下位ビットを反転することは、タイムスタンプに直接反対する場合と同じように、固定値に対して xor されたタイムスタンプの場合と同じくらい簡単です。

安全であるためには、毎回異なる値を使用する必要があります。毎回異なる安全な乱数を使用するワンタイムパッド、またはキーから新しい値を安全に生成できる関数。最初のケースで、毎回新しい乱数を使用している場合、その数値をキーとして使用しないのはなぜですか? 2 番目の方法では、ストリーム暗号を使用する必要があります。これは、保持している秘密鍵から出力を xor するために使用できる疑似ランダム ストリームを生成します。ただし、そのストリームのどこにいたかを追跡する必要があります。ストリームを繰り返すと、同じ古い問題に遭遇するため、このアプローチははるかに複雑でデリケートです。

には、暗号的に安全で推測不可能な値の優れた使いやすいソースが既にあります/dev/urandom。あなたもそれを使うかもしれません。サブスクライバーごとにランダム値を保存するだけです。サブスクライバーごとにわずか 4 バイト (16 進値を格納する場合は 8 バイト) です。現在、32 ビットは優れたセキュリティではありません。十分に試行すれば、誰かが他の誰かの購読を解除できる可能性が十分にあります。しかし、試行回数を制限するために何かをするのであれば、それほど悪くはないはずです。また、リンクごとにより多くのバイトをフェッチするだけで、いつでも簡単にセキュリティを強化できます。

于 2012-12-19T08:50:08.267 に答える