より良いエンジニアを目指して

1日1つ。良くなる!上手くなる!

コードを書いてBasic認証について学ぶ

Web上で使われているHTTPの認証方式として、Basic認証があります。

あまりよく理解していないので、Basic認証について学んでみることにしました。

ja.wikipedia.org

developer.mozilla.org

Basic認証は、

  1. ユーザー名とパスワードをコロンで繋ぐ(user:password)
  2. Base64変換
  3. Authorizationヘッダーに付与
  4. 指定のページへリクエス

Pythonで、GitHub APIに対してBasic認証をしてみます。 developer.github.com

# HTTP通信を行うための標準ライブラリ
import urllib.request

# Base64を扱うための標準ライブラリ
import base64

# 送信先のURL
user = "user";
password = "password"; # GitHub APIの場合、パスワードでは無く、PersonalAccessToken
url = "https://api.github.com/user";
basic_user_and_password = base64.b64encode('{}:{}'.format(user, password).encode('utf-8'))

# Basic認証付きの、GETリクエストを作成する.
request = urllib.request.Request(url, 
    headers={"Authorization": "Basic " + basic_user_and_password.decode('utf-8')})

# 送信して、レスポンスを受け取る.
with urllib.request.urlopen(request) as res:
    data = res.read()

data

Base64は可逆性があるため、このリクエストが他人が覗いてしまえば

  1. Authorizationヘッダーを取得
  2. Base64文字列を戻す
  3. ユーザー名とパスワードが取得

あっさりバレます。

上記のようなコードが書ける・理解が出来るレベルであれば、簡単に解読可能という訳です。

検閲などに対抗すべく、httpでは無くセキュアな通信を担保するhttpsが主流になりつつあります。

ja.wikipedia.org

それだけに現在はhttpssがついていないサイトは安全ではないと警告される訳ですね。

f:id:rimever:20191124203735p:plain
東京都のサイト。保護されていない通信って、やばいじゃん!

参考サイト

www.yoheim.net

気になること

C# で、以下のようなコードを書いたのですが、Forbiddenになってしまったので、調査中・・・。

        private static async Task<HttpResponseMessage> RequestWithBasicAuthentication(string url, string userName, string password)
        {
            var request = new HttpRequestMessage
            {
                Method = HttpMethod.Get,
                RequestUri = new Uri(url)
            };

            request.Headers.Authorization = new System.Net.Http.Headers.AuthenticationHeaderValue(
                "Basic",
                Convert.ToBase64String(Encoding.UTF8.GetBytes($"{userName}:{password}")));

            using (var httpClient = new HttpClient())
            {
                return  await httpClient.SendAsync(request);
            }
        }