TIL[認証/セキュリティ]ベース


HTTPS (HTTP + Secure)


HTTPSはHTTPプロトコルの内容を暗号化し,補完性を高めた.既存のHTTPは,リクエストの内容を見たい人がいれば,そのまま調べることができる.これにより、重要な情報が露出しやすくなります.
しかし、HTTPSは要求されたコンテンツを暗号化するため、情報が漏洩しても正しい鍵がなければ、どのようなコンテンツなのか分からないため、データプロバイダの身元を保証することができる.
認証の重要な理由の1つは、データ・プロバイダのアイデンティティを確保することです.
  • クライアントは、データプロバイダが提供するデータのみを使用できます.
  • は仲介者の攻撃を受けやすく、リクエストと応答が中断します.

    HTTPS特性

  • 証明書(Certificate)
  • データプロバイダ認証
  • ドメイン関連
  • リクエストが受信されると、サーバは証明書とともに応答を送信します.
  • の応答を受信したクライアントは、証明書内のドメインを応答オブジェクトで作成したドメインと比較します.
  • ならok

  • CA (Certificate Authority)
  • 認証機構

  • 非対称鍵暗号化(公開鍵暗号化)

  • 鍵Aで暗号化=>鍵Bでのみ復号できます!


  • Hand Shakeは互いに検証し、サーバはクライアントの公開鍵のペアを渡す.

  • クライアントは、転送された鍵を使用して、サーバと鍵を作成する情報を暗号化して転送します.

  • クライアントと同様に、サーバは任意の数の情報を暗号化して渡すことができます.

  • クライアントとサーバは、作成および交換された情報に基づいて鍵を生成します.

  • クライアントは,それぞれ生成した鍵に基づいてテキストにデータを作成する秘密鍵を用いて暗号化して転送する.

  • サーバも作成した秘密鍵を使用して復号し、クライアントに再暗号化して転送します.

  • クライアントが同じコンテンツのデータの復号に成功した場合、鍵は正常に作成されました.(HTTPS接続成功)
  • HTTPS専用証明書の発行

    mkcertという名前のプログラムを使用して、ローカル環境で信頼できる証明書を発行できます.
    Ubuntu$ sudo apt install libnss3-tools $ wget -0 mkcert https://github.com/FiloSottile/mkcert/releases/download/v1.4.3/mkcert-v1.4.3-linux-amd64 chmod +x mkcert sudo cp mkcert /usr/local/bin/macOS$ brew install mkcert $brew install nss証明書の生成$ mkcert -install認証機関としてローカルに追加$ mkcert -key-file key.pem -cert-file cert.pem localhost 127.0.0.1 ::1ローカル環境の証明書の作成
    =>cert.pemkey.pemファイルを生成します.
    (key.pemの場合は秘密鍵でgitには提出されず、パスワードのように扱われます)

    HTTPSサーバーの作成


    node.js httpsモジュールの使用
    const https = require('https');
    const fs = require('fs');
    
    https
      .createServer(
        {
          key: fs.readFileSync(__dirname + '/key.pem', 'utf-8'),
          cert: fs.readFileSync(__dirname + '/cert.pem', 'utf-8'),
        },
        function (req, res) {
          res.write('Congrats! You made https server now :)');
          res.end();
        }
      )
      .listen(3001);
    express.使用
    const https = require('https');
    const fs = require('fs');
    const express = require('express');
    
    const app = express();
    
    https
      .createServer(
        {
          key: fs.readFileSync(__dirname + '/key.pem', 'utf-8'),
          cert: fs.readFileSync(__dirname + '/cert.pem', 'utf-8'),
        },
        app.use('/', (req, res) => {
          res.send('Congrats! You made https server now :)');
        })
      )
      .listen(3001);

    暗号化(Encryption)


    アルゴリズムを使用して情報を管理するプロセスでは、情報を所有している人以外に理解できないように、情報のセットを任意の方法で別のセットに変換します.

    Hashing


    任意の演算を任意の文字列に適用し、他の文字列に変換します.
    鉄の法則
    1.すべての値についてハッシュ値を計算するのにあまり時間がかかりません.
    2.ハッシュ値はできるだけ避け、すべての値に一意のハッシュ値があります.
    3.小さな単位変更でも、全く異なるハッシュ値が必要です.

    Salt


    暗号化が必要な値に「個別の値」を追加することで、結果を変更します.
  • のみ暗号化されている場合、表示される結果は同じです.
    (ハッシュ値と元の値をテーブル生成して符号化するとリスクが生じる)
  • .
  • の元の値に任意の所定の「独立文字列」を追加してハッシュする場合、アルゴリズムが露出しても元の値
  • を保護できる既存のハッシュ値とは全く異なるハッシュ値が返される.
  • 既存:(暗号化する値)=>(ハッシュ値)
    Salt:(暗号化する値)+(Salt)=>(ハッシュ値)
  • を使用
    Saltを使用する際の注意事項
    1.Saltは、各ユーザーとパスワードに一意の値を指定する必要があります.
    2.ユーザーアカウントを作成し、パスワードを変更する場合は、新しい任意のSaltを使用して復号する必要があります.
    3.二度と使用しない.
    4.DBのユーザテーブルに一緒に保存する必要があります.

    Cookie


    HTTPは無状態で、どのように情報を維持しますか?=>クッキー
    Webサイトにアクセスすると、サーバがクライアントに送信する小さなデータ
  • サーバは、
  • を介してWebブラウザに情報を格納およびロードすることができる
    ドメインにCookieが存在する場合、Webブラウザはドメインにhttpリクエストを発行すると同時にドメインにCookieを送信します.
  • は、主題等の長時間保持が必要な情報を格納するのに好適である.
    これらのクッキーの特性により、サーバは、認証情報を含むクッキーをクライアントに送信することができ、クライアントは、要求のように受信したクッキーを送信することができ、無状態のインターネット接続を維持することができる.
    しかし、Cookieは長時間保持され、JSでアクセスできるため、Cookieに敏感になるリスクがあります.
    Cookie伝達方法

    Cookieオプション
  • ドメイン:サーバが要求されたドメインと一致する場合、Cookie転送
  • Path:サーバとリクエストの詳細パスが一致する場合、Cookie
  • が送信される
    Expiresの
  • MaxAge:Cookieの有効期間設定
  • HttpOnly:スクリプト内のCookieにアクセスできるかどうかを決定
  • セキュリティ:
  • HTTPSプロトコルのみでCookieを転送するかどうかを決定
  • SameSite:CORSリクエストの場合、
  • はオプションとメソッドに依存します.