dackdive's blog

新米webエンジニアによる技術ブログ。JavaScript(React), Salesforce, Python など

Basic認証とDigest認証のまとめと、Salesforceでの実現方法

非常に基本的な話ですが、認証方式についてちょいメモ。
また、ApexでどうやってBase64エンコードMD5ハッシュ化を行うかについては
おまけ程度に。

Basic認証

  • ユーザ名とパスワードを:(コロン)でつないだものをBase64エンコード
  • Httpのリクエストヘッダにはこんな感じでエンコードした文字列がそのまま送信される
Authorization: Basic dGVzdDpob2dlaG9nZQ==

Base64

  • データを64種類の英数字のみの文字列に変換するエンコード方式
  • HTTPヘッダでは特殊記号を扱うことができないため、このエンコード方式が使われる

Digest認証

  • ユーザ名とパスワードをMD5でハッシュ(ダイジェスト)化して送る。

MD5

特徴

(1) 元のデータの長さに関わらず、同じ長さの結果が得られる
(2) 元のデータが異なれば、得られる結果は全く異なるものになる
(3) 元のデータが同じであれば、得られる結果は同じものになる
(4) 得られた結果から、元のデータを得ることはできない

このような一方通行のハッシュ関数の例としてはSHA256とかSHA512とかがある。

両者の違い

  • Digest認証は、Basic認証では防げなかった盗聴や改竄を防ぐ目的で考案された
  • Basic認証エンコードした文字列から元のユーザ名:パスワードという文字列を簡単に復元(デコード)できるが、Digest認証はハッシュ化した値から元の文字列を復元することができない(一方向ハッシュ関数

SalesforceでのDigest認証

// Base64エンコード
Blob data = Blob.valueOf('Test data');
String b64Data = EncodingUtil.base64Encode(data);

// MD5
String inputString = 'Input String';
String md5Coded = EncodingUtil.convertToHex(Crypto.generateDigest('MD5', Blob.valueOf(inputString)));

MD5についてはgenrateDigestだけだとバイナリ値が返されるのでconvertHexで16進数に変換する必要がある。

リファレンス

ぱそくま パソコンなんでも辞典 | linux > Apache HTTP > ベーシック、ダイジェスト認証

http://www.phppro.jp/school/security/vol3/1

暗号化したパスワードが漏洩するワケ ここの一方向ハッシュ関数の話が非常に分かりやすかった。

以下、Apexのリファレンス

Salesforce Developers

http://www.salesforce.com/us/developer/docs/dbcom_apex250/Content/apex_classes_restful_crypto.htm