More Related Content
More from tzm_freedom (11)
第4回web技術勉強会 暗号技術編その2
- 2. • 公開鍵暗号方式
• RSA
• Man In The Middle
• ハイブリッド暗号
• 一方向ハッシュ
• 弱衝突耐性と強衝突耐性
• メッセージ認証コード
アジェンダ
- 4. RSA
暗号文 = 平文E mod N
平文 = 暗号文D mod N
平文/暗号文を表す数をE/D乗して剰余計算するだけ!
→EとNの組み合わせが公開鍵、DとNの組み合わせが秘密鍵
a = bytes_to_long(b64d("nOcQOvHV8rc-
hcfP_RmxMGjyVlruSLeFXTojYcbixaAH36scUejjaws31orUjmYqB5isE9ntdsL4DnsdP_MDJ2mtYD2FIh8tBkJjgXitjdcDclrwELAx846wBIlSES8wR6czpdJZfSwhL_92EGpDH6z7l
KEClqhDlbtZ-
yFKFj9BQRwaEXWV7uuq23gxXOqyEN0WXl3ZJPgsodCnlXRn9y_r5CNV9V4wvzXGlJhT3Nv_N_Z5XNZIjZnHdCuE_itT4a1xENEEds7Jjg5mRTlVFzYv5iQtBo7jdY5ogMTgKPm
Rh6hYuqLeki3AOAUff1AGaN9TZH60UxwTw03-DQJL5C2SuC_vM5KIWxZxQniubfegUCBXpJSAJbLt8zSFztTcrLS4-
wgUHo1A8TDNaO28_KsBUTWsrieOr3NfCn4bPNb7t8G90U60lW0GIhEda3fNYnV0WWpZVO1jCRNy_JYUs3ECo0E1ZQJZD72Dm6UjiuH7eR3ZgNKR9tlLNdyZSpZUZPErLrXJ
90d5XbmJYvRX9r93z6GQqOv5FQy1JhatwefxhKdyhkDEHsqELO0XDqnDnmgxkEEU-lHYSVGz-
iDlUZOUYTTCtxsPDmBIXOMuwp0UydJphO36qRQaDyEjHNsYKLj5KVvjDHS8Gw1FhbFvsoUrBHre4hLY9Pa5meatV_k"))
64010672627831912665943192985870726554849563879433527121407485961693246147925816544675484368071612950281242748899938542292710195458
63537421787690134806502330432319597394499473424879076191825128127619805635856946941496178909131667802582016848925701574118485113483
32396253035684855913691742013947790025083603161078930452379151334805843557358109304228135658809043429555085027115536160671742230209
28772662070909231876486471724150000457477149974523240213988360532362038192411090520553359405538629413124882739119968745006567402669
71694468505167777241302926827565884354268666046482404236610071961135895469515202094666256672997096885334277962891259594034455020372
95792693107750611735068842744404199734827982093138118631982220297293741870750640027191603742769821684226255109249941744057642859529
18979085152428860179935453447595412456387077839766399592918659270829056380834756111545455341101333581448258574156567478785383770993
89845698701864852093845999905319433437944996037414495689503744378861560635321297840559783421950445154195176592124892155792107559649
49367350100185206763817272023305071449788232867917449585121347149323337821415633455025489119275620620193644519028790277690042048623
166572492795617378443748964613269463470767474438133753
- 5. RSAの鍵のパラメータの求め方
1. N = p * q (p, qは素数)となるようなp, q(大きい値)の組み合わせを用意する
2. p-1, q-1の最小公倍数を求める(L = lcm(p-1, q-1))
3. EとLの最小公約数が1 (互いに素)となるようなEを求める
4. E * D mod L = 1となるようなDを求める
• pとqの組み合わせが漏洩するとDが特定される
→大きなNの素因数分解を高速にできる方法が発見されたらRSAは解読できる
- 6. パラメータ利用例:JWK
Json Web Key: デジタル署名を検証するための鍵を公開するための仕組み
https://tools.ietf.org/html/rfc7517
• Salesforce (OpenID Connect)
https://login.salesforce.com/id/keys
• Google
https://www.googleapis.com/oauth2/v2/certs
def get_rsa_publickey(jwt_header):
"""
https://{sfdcドメイン}/id/keysから公開鍵を取得する。
"""
kid = json.loads(b64d(jwt_header).decode())["kid"]
req = urllib.request.Request(url=BASE_URL + "/id/keys")
res = urllib.request.urlopen(req)
jsonMap = json.loads(res.read().decode())
…
modulus = b64_to_long(target_key["n"])
exponent = b64_to_long(target_key["e"])
return RSA.construct((modulus, exponent))
- 7. Man In The Middle (MITM)
• 中間者攻撃と言われる、送信者と受信者の間を中継して盗聴する
②攻撃者の公開鍵で暗号化
①攻撃者の公開鍵を
「受信者の公開鍵」として渡す
④受信者の公開鍵で暗号化
③攻撃者の秘密鍵で復号化
⑤受信者の秘密鍵で復号化し、
改竄されたメッセージを受け取る
• 問題は「受信者の公開鍵」が「攻撃者の公開鍵」にすり替わっている(なりすまし)こと
→このなりすましを防ぐ手段が「デジタル証明書」(=公開鍵が正しいことを証明する仕組み)
※ちなみにMITMはSSL/TLS等で暗号化された通信をデバッグ用途で復号化することにも利用できるため、悪いこと
ばかりではない。(Fiddler, Charles, mitmproxy)
攻撃者 受信者送信者
- 9. 一方向ハッシュ
• 任意のデータが「本物であるかどうか」を担保する性質(正真性)を高めるための技術
• ソフトウェアの改竄検知
• パスワード+ソルトによる暗号化(DBにパスワードをそのまま保存しない暗号技術)
• メッセージ認証コード
• デジタル署名
• 擬似乱数生成器
• ワンタイムパスワード
• あるデータを別の短い値(固定値)に変換する処理
→”データの指紋を取る“ことに相当する
• 入力を「メッセージ」、出力を「ハッシュ値」( 「メッセージダイジェスト」「フィンガープリント」 )と呼ぶ
• アルゴリズムとしてはMD5、SHA-1、SHA-2等
※ただし、MD5は強衝突耐性が破られているため、安全ではない。SHA-1もセキュリティ欠陥の可能性がある。
• 一方向(不可逆)なため、生成した文字列から元の文字列を予測することは不可能。
- 12. メッセージ認証コード
• Message Authentication Code(MAC)と呼ばれるメッセージの認証を行う技術
→「メッセージが正しい送信者からのものである」性質(=なりすましを防止する)
• IPSec
• SSL/TLS
• AWSのAPIの認証方式(Signature Version4など)
• 鍵(共有)に依存した一方向ハッシュ
② メッセージ+メッセージ認証コードを送信
① 共有された鍵を使って、メッセージに対するメッ
セージ認証コードを生成
③ 共有された鍵を使って受信したメッセージのメッセージ認証
コードを生成
④ 受信したメッセージ認証コードと③で生成したコードを比較
→一致すれば認証成功
受信者送信者
- 13. メッセージ認証コード
• 一方向ハッシュ関数(SHA-1, MD5)を使うこともできるし(HMAC)、ブロック暗号を使って実現することも可能
• 一方向ハッシュ関数を使うとHMAC-SHA1, HMAC-MD5というアルゴリズムになる
• ブロック暗号を使う場合はCBCモードで暗号化して、最後のブロックだけメッセージ認証コードとして利用する
• CBC-MAC, CMAC, PMAC
• 送信者と受信者が鍵を共有するため、「鍵配送問題」が発生する
• 再生攻撃による「なりすまし」が可能
• シーケンス番号、タイムスタンプ、ノンスを使って攻撃を防ぐ
→メッセージが少しでも異なればメッセージ認証コードも変わる
• 第三者が認証を証明することが出来ない
→第三者が認証を証明するためには、第三者が同じ鍵を持つ必要があり、その第三者がメッセージ認証コードを作
成できてしまう。
• 否認防止ができない
→受信者も同じ鍵を持つため、メッセージを作成したのは受信者かもしれない。
- 14. HMACの例:Signature Version4
CanonicalRequest =
HTTPRequestMethod + '¥n' +
CanonicalURI + '¥n' +
CanonicalQueryString + '¥n' +
CanonicalHeaders + '¥n' +
SignedHeaders + '¥n' +
HexEncode(Hash(RequestPayload))
StringToSign =
Algorithm + '¥n' +
RequestDate + '¥n' +
CredentialScope + '¥n' +
HashedCanonicalRequest))
kSecret = Your AWS Secret Access Key
kDate = HMAC("AWS4" + kSecret, Date)
kRegion = HMAC(kDate, Region)
kService = HMAC(kRegion, Service)
kSigning = HMAC(kService,
"aws4_request")
HexEncode(HMAC(derived-signing-key, string-to-sign))
Authorization: algorithm Credential=access key ID/credential scope, SignedHeaders=SignedHeaders,
Signature=signature