2009-11-26 19 views
5

私はASP .Net MVCアプリケーションを開発しています。私の行動の一つは、パラメータとしてidが必要です。例:あなたが見ることができるようにGUIDの一部をIDとして使用する

public actionresult Detail(Guid id){ 
    return View(); 
} 

は、私はGuid代わりのIntを使用しています。問題はより美容的です。 URLは非常に長くなる可能性があります(例:localhost/Detail/0c157b42-379d-41d5-b9ba-83e9df9985b2)。

Guidの部分のみをlocalhost/Detail/0c157b42とするのは安全ですか?

答えて

4

GUIDはユニークであるように設計されていますが、その一部はそうではありません。詳細は、this blog postを参照してください。 SHA-1や(セキュリティ上の懸念がない場合)MD5のように、GUIDを短縮する必要がある場合は、そのハッシュを取ってください。

+0

?つまり、問題の例が有効な場合は36文字の長さのGUIDをとり、32文字に__shorten__します。(__if__を使用するとmd5が使用され、32文字になり、SHA1ではなく48文字になります) – pihentagy

+0

@pihentagy:ポイントは、ハッシュした後にハッシュに参加することができますが、 GUID自体の一部を使用することはできません。 – sharptooth

3

いいえ、安全ではありません。

SHA-2ハッシュを計算することはできますが、その最初の数文字を取ることができます。

+0

これはユニークではありません! – pihentagy

+0

GUIDの部分文字列よりもユニークで、おそらく乱数よりも一意である可能性があります。 – Spongeboy

2

いいえ、サブセットが一意ではない可能性があるため、GUID全体が必要です。例えば

0c157b42-379d-41d5-b9ba-83e9df9985b2

0c157b42-379d-41d5-b9ba-83e9df9985b3

注意、最後の番号が異なっています。始まりはどちらも同じです。 GUIDの末尾は、作成時にGUIDのどの部分が変更されるかを予測する方法がないため、使用できません。

-2

後半応答のビットが、誰もがこれを読み込む場合は...

は、用途に応じて、あなたが短縮GUID値を提供することができます。

たとえば、ID値が生成され、認証トークンの値としてユーザーに与えられた場合、生成中に多くの文字を使用して他の値と比較することができます。一致するものがあれば、ただ新しいものを生成し、その固有のものまで再比較してください。

また、GUIDのハッシュ値をトリミングしても、この方法を使用することをお勧めします。実際にIDとして使用する値をランダムに生成する場合は、必ず「使用中ではない」ことを確認する必要があります。

+0

競合状態の危険性があるため、「使用していないかどうかを確認する」ことをお勧めします。これは、別のスレッドが同じIDを同時に生成する場合に備えて、データベースをロックする必要があることを意味します。完全なGUIDを作成したり、IDの作成をDBの責務(例えば、自動インクリメントInt)に適用する方がはるかに良い – Spongeboy

0

その他のオプション - *複数のGUIDで始まる詳細がある場合0c157b42の場合、URL localhost/Detail/0c157b42に適用可能なDetailsオブジェクトのリストが表示されます。 * URLエイリアシング - Detailsオブジェクトの "Friendly URL"フィールドを許可します。

0

-sのGUIDを消去し、16進数を16文字に短縮するBase32(A-Z、0-5)に変換することができます。

+0

GUIDは128ビット整数です。 Base32は文字あたり32個の値で、5ビットの「2^5」です。 guidを完全に表現するには '128/5 = 25.6'文字が必要です。 Base64は '128/6 = 21.3'でより短くなります。小数成分はパディングによって識別されるため、これを補うためにこれらの数値を2つのノッチにバンプする必要があります。 – Travis

関連する問題