2012-03-14 4 views
0

私はトークンで2つの値、リンクIDとユーザーIDを識別する必要がある短いURLアプリケーションを作成しています。理想的には、このトークンは短くする必要があります。短いURLトークンに2つの値をエンコードする

たとえば、URL「http://sho.rt/15qq6」を考慮すると、トークン「15qq6」は、リンクとユーザーIDを識別する必要があります。

テーブルに両方の値を挿入し、自動生成されたIDをトークンとして使用することをお勧めしますが、私はそうではないでしょう。私は暗号化を含むソリューションを好むだろう。

可能であれば、そのような目的で.NET暗号化クラスをどのように使用できますか?ご協力いただき誠にありがとうございます。

+0

ユーザーIDとリンクIDの長さはどのくらいですか? –

+0

暗号化を使用する場合は、あなたが望むよりもはるかに長い文字列を得るでしょう –

+0

これらはどちらも整数です。トークンが短すぎると分からなければOKです。ありがとうございました! –

答えて

3

あなたのコードをどのくらい短くしたいか分かりません。私はいくつかのコードをオンラインで投稿しましたto encrypt any number of query arguments

結果をbase64でエンコードすると結果が短くなる可能性があります。それはまだあなたのために十分な短さではないかもしれません。 (base64エンコーディングに関するいくつかの懸念は大文字と小文字が区別されるため、base64エンコードしていないことに注意してください。)

もう1つの方法は、IDとデータベースのIDで構成されるコードを考え出すことですチェックサムのユーザーがIDの変更を試みると、これを検出できます。しかし、この手法は安全ではないかもしれません。なぜなら、独自のチェックサムを作成する方法を理解することが難しくないからです。

+0

+1。あなたのサンプルは、暗号化の使い方を見るのに十分なはずです。また、Urlに戻すために、私はbase32エンコーディング(url-safeと大文字小文字の変更を無視)か、またはUrl-safe文字のみを使用する少なくとも修正されたbase64を使用します。 –

+0

@Alexei:はい、base32は良い妥協点かもしれません。 –

3

簡単な答えは「できません」です。少なくとも、簡単にはできません。

暗号化は通常、暗号化されるデータの長さを変更しません。したがって、エンコードして暗号化するURLとUserIdを取得すると、同じ長さのトークンになります。

暗号化する前にデータを圧縮してみることもできますが、1つのURLに冗長性はほとんどありません。

データをハッシュして結果を短くしますが、このプロセスを元に戻してURLとuserIdを元に戻す方法はありません。

もし短いトークンであれば、トークンをキーとして使用して、サーバ上のルックアップテーブルと考えることができます。

1

ランダムトークンを生成し、このトークンのリンクとユーザIDをdbに保存します。それは十分なセキュリティです。

+0

十分に安全かどうかはどのように分かりますか?たぶん彼はあなたの銀行で働き、これらのURLを使ってあなたの当座預金口座にすばやくアクセスできるようにしています。 –

+0

ランダムトークンには情報が含まれておらず、ランダムトークンは選択されません。より良いセキュリティのために、crypto randomを使用することができます。 –

3

暗号化の仕組みを正確に理解しているとは思いません。

暗号化は、元の暗号化キーを知らなくても、応答の解読を困難にする手法です。

暗号化されたデータは、少なくともそれよりも大きくない場合、元のデータと同じ長さです。 URLをより少量のデータにエンコードする有効な方法はありません。これはURLで有効です。

データベースを使用してください。これがそのためです。

編集:D'oh、Andrewは編集後により良い返答で私にそれを打ちました。

2

RNGCryptoServiceProviderのようなものを使用して、固有の文字セットを生成することができます。 "a"から "z"、 "A"から "Z"、および "1"から "9"のような文字の範囲を保持するいくつかの定数文字列を使用します。ランダムに大文字と小文字を混在させた英数字の文字列を元のURLとUserIDで保存します。

1

暗号化が必要ない場合は、Convert.ToBase64StringBitConverter.GetBytesの単純な組み合わせよりも合理的な文字列が得られます。 Base64ではURL以外のいくつかの人手を使用しているので、結果をWikiPedia Base64に置き換えるか、Base32エンコーディングを使用することを検討してください。

int first =1234; 
int second =789; 
var encoded = Convert.ToBase64String(
     BitConverter.GetBytes (((ulong)first<<32)+(ulong)second)); 
関連する問題