SlideShare una empresa de Scribd logo
1 de 14
SHA-256 を学ぼうとする
(Secure Hash Algorithm)
uji52
2016/09/07
uji52
自己紹介
• uji52
• age: 27
• region: Hikone->Kyoto->Yokohama
• My favorite
• ハッシュ関数
• SHA-256
(他をほとんど知らない気がする)
• 調味料
• わさび
• 塩コショウ
2
SHA-256を紐解くぜ!
数学の勉強も好きやしおもろいかも
3
と思ったけど
思ったより難解やった…
ので、概要のご説明的な内容です
4
SHAとは(1)
• NIST(National Institute of Standard and Technology)
• アメリカ国立標準技術研究所
• すっごいいろいろやってるところ
• 物理学から化学から情報まで様々
• 暗号化技術等の選定、標準化等も
• AES(Advanced Encryption Standard)
• 暗号化方式
• SHA(Secure Hash Algorithm)
• ハッシュアルゴリズム
5
SHAとは(2)
6
SHA登場(現在はSHA-0)とも呼ばれるFIPS 1801993年
SHA-1登場FIPS PUB 180-11995年 (案外昔からあるんやな〜)
2001年 変形verいくつか登場(SHA-224、SHA-256、SHA-384、SHA-512)
2012年 更にいくつかの変形ver登場SHA-512/224、SHA-512/256
合わせて
SHA-2と
呼ばれるFIPS PUB 180-2
2012年 SHA-3のアルゴリズムが決定
2015年 SHA-3の正式版リリースFIPS PUB 202
実際にハッシュ化しよう
7
$ irb
irb(main):001:0> require 'digest/sha2'
=> true
irb(main):002:0> Digest::SHA256.hexdigest "uji52"
=> “7730a0175eb494861993a5fdc899b393415f0def92ffd5130abee366dfa15348"
irb(main):003:0> Digest::SHA256.hexdigest "uji53"
=> "0c47f8156e7b256efee86cc135451def80b4c544af16e24af81b2548009e37b8"
irb(main):004:0> Digest::SHA256.hexdigest ""
=> "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
←Rubyをインタプリタで起動するで(するやで、は封印)
←SHA-2を使う宣言
←”uji52”をSHA-256
←”uji53”をSHA-256
←空文字列をSHA-256
ほんの少しの変更でガラッと変わる
空文字でもしっかりハッシュ化してくれる
ハッシュしても危険やで
8
詳しい人なら
答えを知ってれば問題は分かる
0c47f8156e7b256e
fee86cc135451def
80b4c544af16e24a
f81b2548009e37b8
uji52を
SHA-256した
値やな
問題
中央アメリカのパナマと
陸上で国境を接している
南アメリカの国はどこでしょう?
答え
コロンビア
ハッシュ化した値を
沢山知っていたら元の値も分かる
↑悪フザケ
レインボーテーブルとか
ハッシュ化する上で大事なこと
• ハッシュ化するときに工夫するで
• salt (salt and pepper)
• ハッシュ化する前に元の値に味付け(塩)して途中にも味付け(胡椒)
• ストレッチング
• 複数回ハッシュ化することで計算量を上げちゃおう
• アルゴリズムは被らないことが大事
• 第一原像計算困難性
• 与えられるハッシュ値になる元値探し
• 第一原像計算困難性
• 与えられる元値と同じハッシュ値になる元値探し
• 衝突困難性
• ハッシュ値が同じになっちゃうペア探し
9
hが与えられて
h=hash(m)になるm探し
m1が与えられて
hash(m1)=hash(m2)になるm2探し
hash(m1)=hash(m2)になるペア探し
それでは
SHA-256ハッシュ関数を
紐解いていきましょう
10
SHA-256の大まかな流れ
11
入力データ
分割入力データ[0]
分割入力データ[1]
分割入力データ[2]
64Byte毎に分割
64Byte
ハッシュ値
分割入力データ[i]←計算
まだある?
i == n
ある
ない
完成したハッシュ値
←長さ足りひんかったら
もちろんpadding
興味あったところ
256bit
SHA-256に使う値
12
分割入力データ[0]ハッシュ値
256bit
分割ハッシュ値[0]
分割ハッシュ値[1]
8分割
分割ハッシュ値[7]
32bit
分割入力データ[0][0]
分割入力データ[0][1]
分割入力データ[0][15]
4Byte
64Byte
16分割
4倍に増やす
分割入力データ[0][0]
分割入力データ[0][1]
分割入力データ[0][63]4倍に増やす部分
分割データ[0][n]をD(n)と呼ぶとすると
D[16]〜D[63]を下記方法で作る
D(n) = D(n - 2) + D(n - 7) + D(n - 15) + D(n - 16)
SHA-256でやってること
13
428a2f98 71374491 b5c0fbcf e9b5dba5 3956c25b 59f111f1 923f82a4 ab1c5ed5
d807aa98 12835b01 243185be 550c7dc3 72be5d74 80deb1fe 9bdc06a7 c19bf174
e49b69c1 efbe4786 0fc19dc6 240ca1cc 2de92c6f 4a7484aa 5cb0a9dc 76f988da
983e5152 a831c66d b00327c8 bf597fc7 c6e00bf3 d5a79147 06ca6351 14292967
27b70a85 2e1b2138 4d2c6dfc 53380d13 650a7354 766a0abb 81c2c92e 92722c85
a2bfe8a1 a81a664b c24b8b70 c76c51a3 d192e819 d6990624 f40e3585 106aa070
19a4c116 1e376c08 2748774c 34b0bcb5 391c0cb3 4ed8aa4a 5b9cca4f 682e6ff3
748f82ee 78a5636f 84c87814 8cc70208 90befffa a4506ceb bef9a3f7 c67178f2
32bitのハッシュ値 x 8
入力値を元に生成された4Byteの値 x 64
定数k 8桁の16進数 x 64
これらの値をビットシフトとXORして
ハッシュ値を作ってるみたいです。
時間の都合上この辺りで割愛
(諦め)
←これの4つめと8つめをハッシュしてローテーションしていく(それを64回)
↑←この2つがハッシュするためのXOR素材
まとめ
• 思ったより奥が深い
• 全体に何らかのビット演算って話かと…
• パディング処理も凝ってる…
• 分割処理も凝ってる…
(ハッシュアルゴリズムを簡単に考えすぎてた)
14

Más contenido relacionado

La actualidad más candente

組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由
kikairoya
 

La actualidad más candente (20)

「Android案件できます」って言ったら、ヒドい目にあった話
「Android案件できます」って言ったら、ヒドい目にあった話「Android案件できます」って言ったら、ヒドい目にあった話
「Android案件できます」って言ったら、ヒドい目にあった話
 
C++の話(本当にあった怖い話)
C++の話(本当にあった怖い話)C++の話(本当にあった怖い話)
C++の話(本当にあった怖い話)
 
REST API、gRPC、GraphQL 触ってみた【2023年12月開催勉強会資料】
REST API、gRPC、GraphQL 触ってみた【2023年12月開催勉強会資料】REST API、gRPC、GraphQL 触ってみた【2023年12月開催勉強会資料】
REST API、gRPC、GraphQL 触ってみた【2023年12月開催勉強会資料】
 
プログラムを高速化する話
プログラムを高速化する話プログラムを高速化する話
プログラムを高速化する話
 
XXE、SSRF、安全でないデシリアライゼーション入門
XXE、SSRF、安全でないデシリアライゼーション入門XXE、SSRF、安全でないデシリアライゼーション入門
XXE、SSRF、安全でないデシリアライゼーション入門
 
組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由組み込みでこそC++を使う10の理由
組み込みでこそC++を使う10の理由
 
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
SQLアンチパターン 幻の第26章「とりあえず削除フラグ」
 
GoogleのSHA-1のはなし
GoogleのSHA-1のはなしGoogleのSHA-1のはなし
GoogleのSHA-1のはなし
 
OSS活動の活発さと評価の関係について
OSS活動の活発さと評価の関係についてOSS活動の活発さと評価の関係について
OSS活動の活発さと評価の関係について
 
レシピの作り方入門
レシピの作り方入門レシピの作り方入門
レシピの作り方入門
 
SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021SPAセキュリティ入門~PHP Conference Japan 2021
SPAセキュリティ入門~PHP Conference Japan 2021
 
PFSなTLS通信を復号する
PFSなTLS通信を復号するPFSなTLS通信を復号する
PFSなTLS通信を復号する
 
ミクシィ 21卒向け Android研修
ミクシィ 21卒向け Android研修ミクシィ 21卒向け Android研修
ミクシィ 21卒向け Android研修
 
Spring Boot × Vue.jsでSPAを作る
Spring Boot × Vue.jsでSPAを作るSpring Boot × Vue.jsでSPAを作る
Spring Boot × Vue.jsでSPAを作る
 
Glibc malloc internal
Glibc malloc internalGlibc malloc internal
Glibc malloc internal
 
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
モダン PHP テクニック 12 選 ―PsalmとPHP 8.1で今はこんなこともできる!―
 
Shownet2017 report
Shownet2017 reportShownet2017 report
Shownet2017 report
 
Go 製リアルタイムサーバーの Kubernetes での運用について
Go 製リアルタイムサーバーの  Kubernetes での運用についてGo 製リアルタイムサーバーの  Kubernetes での運用について
Go 製リアルタイムサーバーの Kubernetes での運用について
 
2017年11月02日「radare2」トーク/ワークショップAVTokyo 2017
2017年11月02日「radare2」トーク/ワークショップAVTokyo 2017 2017年11月02日「radare2」トーク/ワークショップAVTokyo 2017
2017年11月02日「radare2」トーク/ワークショップAVTokyo 2017
 
BigQuery で 150万円 使ったときの話
BigQuery で 150万円 使ったときの話BigQuery で 150万円 使ったときの話
BigQuery で 150万円 使ったときの話
 

Destacado

エンタープライズITにおけるSCIM利用ガイドライン by NEC桑田雅彦様
エンタープライズITにおけるSCIM利用ガイドライン by NEC桑田雅彦様エンタープライズITにおけるSCIM利用ガイドライン by NEC桑田雅彦様
エンタープライズITにおけるSCIM利用ガイドライン by NEC桑田雅彦様
OpenID Foundation Japan
 

Destacado (8)

『OpenID ConnectとSCIMのエンタープライズ実装ガイドライン』解説
『OpenID ConnectとSCIMのエンタープライズ実装ガイドライン』解説『OpenID ConnectとSCIMのエンタープライズ実装ガイドライン』解説
『OpenID ConnectとSCIMのエンタープライズ実装ガイドライン』解説
 
SSL入門
SSL入門SSL入門
SSL入門
 
Yahoo! JAPANのOpenID Certified Mark取得について
Yahoo! JAPANのOpenID Certified Mark取得についてYahoo! JAPANのOpenID Certified Mark取得について
Yahoo! JAPANのOpenID Certified Mark取得について
 
エンタープライズITにおけるSCIM利用ガイドライン by NEC桑田雅彦様
エンタープライズITにおけるSCIM利用ガイドライン by NEC桑田雅彦様エンタープライズITにおけるSCIM利用ガイドライン by NEC桑田雅彦様
エンタープライズITにおけるSCIM利用ガイドライン by NEC桑田雅彦様
 
Etherpad-lite導入
Etherpad-lite導入Etherpad-lite導入
Etherpad-lite導入
 
エンタープライズIT環境での OpenID Connect / SCIM の具体的実装方法 idit2014
エンタープライズIT環境での OpenID Connect / SCIM の具体的実装方法 idit2014エンタープライズIT環境での OpenID Connect / SCIM の具体的実装方法 idit2014
エンタープライズIT環境での OpenID Connect / SCIM の具体的実装方法 idit2014
 
110728 Trust Framework - Shingo Yamanaka
110728 Trust Framework - Shingo Yamanaka110728 Trust Framework - Shingo Yamanaka
110728 Trust Framework - Shingo Yamanaka
 
OpenID Connect 入門 〜コンシューマーにおけるID連携のトレンド〜
OpenID Connect 入門 〜コンシューマーにおけるID連携のトレンド〜OpenID Connect 入門 〜コンシューマーにおけるID連携のトレンド〜
OpenID Connect 入門 〜コンシューマーにおけるID連携のトレンド〜
 

Más de Takeru Ujinawa (7)

Twitter API で学ぶ OAuth
Twitter API で学ぶ OAuthTwitter API で学ぶ OAuth
Twitter API で学ぶ OAuth
 
Chrome ExtensionでSelf-Issued OpenID Provider
Chrome ExtensionでSelf-Issued OpenID ProviderChrome ExtensionでSelf-Issued OpenID Provider
Chrome ExtensionでSelf-Issued OpenID Provider
 
CTFを楽しむやで
CTFを楽しむやでCTFを楽しむやで
CTFを楽しむやで
 
SES
SESSES
SES
 
AWS SQS
AWS SQSAWS SQS
AWS SQS
 
AWS KMSと鍵の話
AWS KMSと鍵の話AWS KMSと鍵の話
AWS KMSと鍵の話
 
Cognito User Pool
Cognito User PoolCognito User Pool
Cognito User Pool
 

SHA-256を学ぼうとする