"tamperproof cookie "の作り方


オーライ!それは分でした!タンパプルーフクッキー、私は1つを必要とし、それはそれを介して考えた後、それはかなり簡単です.
私は、それが常に私の最後のポスト以来しばらくあったと常に言います.

問題


フリーランスクライアントのためのマルチファクタ認証のセットアップに取り組んでいます.マルチファクターワンタイムパスワードをすべての設定がありますが、今私は“30日間”機能を覚えて私を実装する方法が必要です.それは比較的単純であるべきですか?クッキーは使えませんか.
それほど速くそこまでそれを考える前に、私を過ぎていない!クッキーはクライアントのローカルストレージに保存されているので、クライアントによって簡単に変更できますdigital signature !
以下に状況について説明します.

基本的に、私は、ユーザーが30日間認証されたデュアルファクタを示していることを示す安全な(タンパー証明)手段にローカルに保管する方法を必要としました.これを行う最も簡単な方法は、有効期限とユーザ名の値でクッキーを保存することです.しかし、この最初のアイディアは、ユーザーがクッキーの値(有効期限とユーザ名)を変更することができて、2番目の要因を過ぎてしまうことができるので、すぐにばらばらになりました.第2のファクターワンタイムパスワード(OTP)エントリーは、クッキーが有効であるならば、ユーザーに提示されなければなりません、特定のユーザーのために、そして、まだ期限が切れない(クッキー作成からの30日).

要件の概要


クライアント側のソリューションに必要ないくつかのことがあります.

  • ユーザーを示す手段として安全に使用できる何かの格納されたクライアント側はOTP
  • ユーザID、電子メールアドレス、または同様のものを通して、ユーザに何らかのユニークな属性を持たなければなりません
  • 物事の妥当性をチェックするとき、考慮される有効期限があるべきです
  • ユーザー情報または有効期限が変更された場合に首尾よく検証してはいけません
  • 解決策


    上記の要件を上記のスクリーンショットに関連づけると、ある種の暗号がクライアント側に保存されているもののタンパープルーフ部分を保証するために使用される可能性があります.
    HMAC - ハッシュベースメッセージ認証コードは、「キー」と「メッセージ」を利用する暗号化操作です.一般的なHMAC署名は以下のようになります.
    digest = hmac(key, message)
    
    The key 部分は、1つ以上の党の間の秘密です-私のケース1つの党とmessage を検証するデータです.私の場合はkey としてユーザーから秘密にされますkey 何が真実かmessage クッキーに入れたものです.
    何が良いkey あなた自身を尋ねるかもしれない使用するには?まあ、それは似たようなものだが、それはユーザー名ではない.ユーザーは既に自分のユーザ名を知っているので、Akey . しかし、パスワード、特にパスワードハッシュがあります.ユーザはリモートシステムに格納されているパスワードのハッシュを知らないので、Akey .
    ユーザのパスワードは基本的に以下のように計算されます:
    password_digest = H(salt||plaintext_password, work_factor)
    
    どこpassword_digest の出力はsalt 連結するplaintext_password Aを通じてone way function H , work_factor 回.The password_digest は、ユーザーが知っている何かではなく、彼らの塩は、各パスワードの変更を変更すると、また、彼らはplaintext_password .
    だから、今我々はkey 候補者、実際のメッセージはどうですか?メッセージは非常に簡単です、そして、我々はOTPクッキー有効期限のdatetimeを使うことができます.完全なHMACコールは以下のようになります.cookie_hash_content = hmac(H(password_hash), expiration_date_string) .
    この全体cookie_hash_content 保存する必要がありますが、クッキーの本体に保存することができますexpiration_date_string 同様に、サーバー側が入力を再構築することができますhmac 呼び出し、それらが一致するかどうかを確認します.
    ありがたいことに、これはクッキー内のフィールドのパイプ(または他の)区切られたセットで十分に簡単です.このフォーマットを使います.
    {expiration_date_string}|{cookie_hash_content}
    
    認証時の上記クッキーの検証は以下のように簡単です.
  • クッキーの値を2つの部分に分割しようとすると
  • 分割の最初の要素を日付として解析し、失敗した場合にfalseを返します
  • 解析された日付が現在のdatetimeの後にあることを確認してください
  • 検証するcookie_hash_content 分割のクッキーの第2の部分を比較することによって、新しく生成されるhmac(H(password_hash), expiration_date_string)
  • マッチしなければfalseを返す
  • を返します.
  • 上記の擬似コードはまた、ユーザーが自分のパスワードを変更した場合、追加の利点を持って、彼らはすぐにOTPクッキーのチェックを失敗します.これはいくつかの方法で物事を少し安全になります.
    ここでは、HMAC(といくつかのユニットテスト)の迅速な実行を介して偽expireDates and passwordHashes : https://replit.com/@Kritner/TamperProofCookies#main.py

    最後の思考

  • これはkey エンドユーザーに知られていない
  • 塩は、必ずしも秘密ではありませんが、エンドユーザーには知られていません.したがって、彼らはkey 利用される
  • 私たちはcookie_hash_content クッキー自体に格納された値に基づいて値を再計算することによってkey それはクッキーにありません、そして、ユーザーによって知られていることができないので、ユーザーが確認ステップを通過することができた「正しい情報」を考え出す機会がありません.
  • リソース
  • Digital Signatures
  • HMAC
  • One Way Function
  • replit
  • Coding blocks slack
  • 写真でnate_dumlao on Unsplash .