Web上で使われているHTTPの認証方式として、Basic認証があります。
あまりよく理解していないので、Basic認証について学んでみることにしました。
Basic認証は、
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は可逆性があるため、このリクエストが他人が覗いてしまえば
- Authorizationヘッダーを取得
- Base64文字列を戻す
- ユーザー名とパスワードが取得
あっさりバレます。
上記のようなコードが書ける・理解が出来るレベルであれば、簡単に解読可能という訳です。
検閲などに対抗すべく、httpでは無くセキュアな通信を担保するhttpsが主流になりつつあります。
それだけに現在はhttpsのsがついていないサイトは安全ではないと警告される訳ですね。
参考サイト
気になること
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); } }