2017-11-01 8 views
0

この例ではLINQPadを使用していますが、私は簡単な例を選択します。実際のところ私はWeb API上でソリューションを実装しています。文字列、数字またはトークンでチェックサム検証を実装します

私はユーザーと役割を持っているとします。何らかの理由で、自分のコードのある時点で、誰もそのユーザーと役割を操作していないことを確認したいと思います。

アリスはとても基本的なユーザーである:私のシステムでは

var bytes = System.Text.Encoding.UTF8.GetBytes("alice:basicuser"); 
string token= Convert.ToBase64String(bytes); 
string revert = System.Text.Encoding.UTF8.GetString(Convert.FromBase64String(foo)); 
Console.WriteLine($"{token} --> {revert}"); 
// YWxpY2U6YmFzaWN1c2Vy --> alice:basicuser 

、私はアリスにトークンを与えます。アリスはこのトークンをどのようにエンコードしたり変換したり生成したかわからないが、推測できる。彼女は簡単に私に

string decode = System.Text.Encoding.UTF8.GetString(Convert.FromBase64String("YWxpY2U6YWRtaW5pc3RyYXRvcg==")); 
Console.WriteLine($"{decode}"); 
// alice:administrator 

のような偽のトークンを送ることができますね場合ので、私は、ユーザーが推測できないというのが私のユーザーとロールの間の操作の結果であるこの検証要素に追加したいと思います。

例えば、あまりにも明白で危険:私は私のユーザーの最初と最後の文字を取ると、トークン作成するための私の役割:

// alice:administrator:aear 

私は何C#のメソッド/関数を使用する必要がありますか?

+0

代わりにハッシュ(塩で)をエンコード/デコードしないでください。塩に加えて、長い秘密の文字列を推測するのは難しいサーバー側を使用してください。適切に行われた場合、ハッキングするのは非常に難しいです。さらに、ロールを定義するためにこの情報を使用しないでください。代わりに、それを使って、それが実際にアリスであることを特定します。役割の情報はデータベースに安全に保管し、クライアント側には絶対に送信しないでください。 –

+0

私は(塩で)ハッシュしますが、これは私の質問についてはここではありません。 2つのトークンを持っているとしましょう。私はこのトークンを解読できる必要があります。非常に良い理由のために、私はここで説明しません(あまりにも)私は自分のデータベース内の役割を確認することはできません。彼らはトークンと共に送らなければならない。 –

+0

"私は、このトークンに、ユーザーが推測できないユーザーと役割の間の操作の結果である3番目の要素を追加したいと考えています。復号化の代わりにハッシングを行う。再び、適切な塩漬けで、それはハックするのが非常に難しいです。 btw、私は最初のコメントを編集しました。あなたはまた、私が編集した部分を読むべきです。 –

答えて

0

あなたのトークンの大きさに強い制約がない限り、それは変更されていないことを確認するための最も安全な方法は、HMACを追加することです。つまり、HMACは秘密鍵で保護されたハッシュです。あなたがこの鍵を知らないなら、それを偽造することは不可能です。

あなたのケースでは、サーバ上に保持するランダムな秘密鍵を生成する必要があります。次に、すでに行った方法でトークンを生成し、この秘密鍵を使用して対応するHMACを生成し、トークン+ HMACをユーザーに送信します。

ユーザーがトークンを送信したら、まずHMACが正しいかどうかを確認します。そうでない場合は、トークンを拒否します。

.NETフレームワークは、あなたが間違った道を進んでいるように見えますhttps://msdn.microsoft.com/en-us/library/system.security.cryptography.hmac(v=vs.110).aspx

-1

を参照してください、HMACsを生成し、検証するために必要なすべてを持っています。クライアントは、どのようなユーザと役割を得るべきかをサーバに決して伝えるべきではありません。代わりに、クライアントはアプリケーションで認証し、特権を取得する必要があります。あなただけの人とあなたができることを決定するのはサーバーだけです。

私はここで2つの有効なアプローチを見ています。

データベースにトークン列(実際にはパスワード)を使用できます。
あなたがそれらを生成したり、ユーザーがそれらを生成することができ、あなたもランダムな値を使用することができます:今

| Token (passwd) | User | Role | 
---------------------------------------------- 
| a7KxmjakQkoOpqJ41Jd | alice | basicuser | 

を、あなたがアリスに、この「a7KxmjakQkoOpqJ41Jd」を与えると、彼女はあなたのアプリケーションに認証するためにそれを使用することができます。彼女は自分の役割を変更したり、ログインを代用することはできません。唯一の脆弱性は、他のユーザーのトークンが弱すぎる場合(トークンの場合は弱く予測可能なランダムジェネレータ、パスワードの場合は弱いパスワードポリシー)、他のユーザーのトークンを推測できることです。

暗号化(ベアラ認証のようなもの)を使用する方法もあります。ユーザーに関するすべての公開データと非秘密データを取り出し、秘密鍵で暗号化します。その後、それをアリスに渡してください。彼女(誰でも)は公開鍵でデータを復号化して読むことができますが、誰もそれを変更することはできません。同じ公開鍵を使用して、このトークンが発行されたことを確認することができます。

私はあなたの質問から、彼女のログイン、役割、これらの2つの値のハッシュを与えたいと思っていますが、あまりにも多くの情報を提供します。誰かがこのデータを収集した場合、彼はあなたのハッシュアルゴリズムを検出することができます。それは不安です。また、アリスの役割を変更すると、トークンの更新が行われます。

関連する問題