この例では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#のメソッド/関数を使用する必要がありますか?
代わりにハッシュ(塩で)をエンコード/デコードしないでください。塩に加えて、長い秘密の文字列を推測するのは難しいサーバー側を使用してください。適切に行われた場合、ハッキングするのは非常に難しいです。さらに、ロールを定義するためにこの情報を使用しないでください。代わりに、それを使って、それが実際にアリスであることを特定します。役割の情報はデータベースに安全に保管し、クライアント側には絶対に送信しないでください。 –
私は(塩で)ハッシュしますが、これは私の質問についてはここではありません。 2つのトークンを持っているとしましょう。私はこのトークンを解読できる必要があります。非常に良い理由のために、私はここで説明しません(あまりにも)私は自分のデータベース内の役割を確認することはできません。彼らはトークンと共に送らなければならない。 –
"私は、このトークンに、ユーザーが推測できないユーザーと役割の間の操作の結果である3番目の要素を追加したいと考えています。復号化の代わりにハッシングを行う。再び、適切な塩漬けで、それはハックするのが非常に難しいです。 btw、私は最初のコメントを編集しました。あなたはまた、私が編集した部分を読むべきです。 –