非常に基本的な話ですが、認証方式についてちょいメモ。
また、ApexでどうやってBase64エンコードやMD5ハッシュ化を行うかについては
おまけ程度に。
Basic認証
Authorization: Basic dGVzdDpob2dlaG9nZQ==
Base64
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のリファレンス
http://www.salesforce.com/us/developer/docs/dbcom_apex250/Content/apex_classes_restful_crypto.htm