hash สมการเบื้องหลัง bitcoin (blockchain)
buzz word ในโลกไอทีช่วงนี้คงเป็นอะไรไปไม่ได้นอกจาก bitcoin และที่สำคัญกว่านั้นคือ เทคโนโลยีที่อยู่เบื้องหลังอย่าง blockchain
ขอนิยาม Blockchain อย่างย่อว่า
- มันคือระบบ database แบบนึง
- ที่นำ ก้อนข้อมูล (block) มาวางต่อเนื่องกันเป็นลูกโซ่ (chain)
- ซึ่งข้อมูลนำมาเชื่อมกันโดยใช้ hash function
- และข้อมูล database ทั้ง blockchain จะถูกคัดลอกและกระจายไปเก็บไว้หลายที่ใน network (Decentralization)
Bitcoin เป็นเจ้าแรกที่การประยุกต์ใช้ blockchain โดยข้อมูลแต่ละ block ก็เป็นข้อมูลผู้รับ ผู้ส่ง จำนวนเงิน และ hash ของ block ก่อนหน้า
อะไรคือ hash function
เทคนิคการทำงานของ blockchain มีรายละเอียดเยอะมาก แต่บทความนี้จะเน้นทำความเข้าใจคำว่า hash
เริ่มที่การทำงานมันก่อน
ตามภาพข้างบน hash คือการแปลงข้อมูลให้อยู่ในรูปที่อ่านไม่ออก
hello1 → 91e9240f415223982edc345532630710e94a7f52cd5f48f5ee1afc555078f0ab
hello2 → 87298cc2f31fba73181ea2a9e6ef10dce21ed95e98bdac9c4e1504ea16f486e4
hello3 → 47ea70cf08872bdb4afad3432b01d963ac7d165f6b575cd72ef47498f4459a90
สังเกตได้ว่า input ของเรา hello1
, hello2
, hello3
ต่างกันแค่เลขตัวหลังสุด แต่ output ต่างกันลิบลับเลย ดูไม่มีแพทเทินอะไรเลย
ดังนั้น เราไม่สามารถแกะแพทเทิน output เพื่อ reverse กลับไปหา input ได้เลย ในขณะที่ ถ้าเราใส่ hello1
เข้าไปใน hash function เราก็จะได้ข้อมูล 91e9240f415223982edc345532630710e94a7f52cd5f48f5ee1afc555078f0ab
เหมือนเดิมเสมอ
เรียกได้ว่า hash เป็น one-way function สมการที่ไม่สามารถไหลย้อนกลับ ส่วน algorithm ของสมการ sha256
(hash function) ก็มีเปิดเผยใน wikipedia
แต่ผมคงไม่พิสูจน์ sha256
ให้ดู เพราะแค่ผมเห็นตัวอักษร Greek ผมก็มึนหัวแล้ว
สมการที่เป็น one-way function แบบเข้าใจง่าย
49 + 51 = 100
49 + 51
ได้ 100
แน่นอน
แต่ถ้ามีแค่ output 100 มา ถามว่า input คืออะไร
100 = 1 + 99
100 = 2 + 98
100 = 3 + 97
…
เราไม่มีทางรู้เลยว่า input ตอนแรกคืออะไร ได้แค่ประมาณค่าเอา เพราะ 100 จะมาจาก 1 + 99
ก็ได้ หรือ 2 + 98
ก็ได้ และแน่นอนว่า hash function เต็มรูปแบบอย่าง sha256
มีความซับซ้อนกว่านี้
มีเว็บใจดีสอนการ hash sha1
แบบ ทีละขั้นตอน ส่วนตัวผมทำได้ครึ่งทางก็รู้แล้วว่าผม reverse ไม่ได้แน่ ใครสนใจลองดูครับ
hash function มีหลายรูปแบบมาก เช่น MD5, SHA and etc.
ใช้ hash function เก็บข้อมูลที่เป็นความลับ
ประโยชน์ที่เด่นที่สุดคือใช้เก็บข้อมูลลับ
สมมติผมสมัครเว็บไซต์นึง ใช้ username
และ password
ว่า bob
123456
ตามลำดับ server ควรเก็บข้อมูลในรูปแบบ
bob
5994471abb01112afcc18159f6cc74b4f511b99806da59b3caf5a9c173cacfc5
ทุกครั้งที่ผม login ทาง server จะหยิบ password ที่พิมพ์ไปทำการ hash ก่อนนำ output ไปเทียบกับ password ที่ hash ไว้แล้วบน server
ข้อมูลต้องถูกเก็บในรูปแบบนี้ เพราะหาก server โดน hack ทาง hacker จะเห็น password ที่ถูก hash ไว้เรียบร้อย
อย่างไรก็ดีถึง hash ไว้แล้ว หาก password ง่ายมาก ก็อาจถูก dictionary attack ได้ เช่น 5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8
สามารถเอา pattern นี้ไป search หาใน google ได้ว่ามันคือคำว่า password
password ที่ดี ก็ตามที่คำเตือนส่วนใหญ่แนะนำ ให้ใส่ตัวใหญ่ตัวเล็ก ผสมตัวอักษร หรือประกอบด้วยประโยคหลายตัวติดต่อกัน
hash function ใน blockchain
blockchain เชื่อมข้อมูลระหว่างกันโดยใช้ hash function
ข้อมูลแต่ละ block ซึ่งประกอบไปด้วยข้อมูลที่เป็น plain text ธรรมดา จะถูก hash ให้กลายเป็น hash code
และใน block ถัดไปก็จะมี hash code ของ block ก่อนหน้าเป็นข้อมูลอยู่
ดังนั้นถ้าจะโกง blockchain ด้วยการ mock ข้อมูลใน block ล่าสุด ต้องสามารถแงะเอา hash code ของ block ก่อนหน้าที่มี hash code ของ block ก่อนหน้า…
Proof-of-work ค้นหา hash ที่นำหน้าด้วยเลข 0
ในการสร้าง bitcoin ก้อนใหม่ ตัวระบบจะมีเงื่อนไขให้หา hash ที่ตัวเลขนำหน้าด้วย 0 ซึ่งจะเป็น 0 กี่ตัวขึ้นอยู่กับ difficulty ในตอนนั้น เช่น ต้องการเลข 0 นำหน้า 12 ตัว
000000000000998062d5d3b4a2806bfcffee34ab04b2d7a16264b4eca3bfac24
เราก็ต้องเปลี่ยนค่าใน input ไปเรื่อยๆ จนกว่าจะเจอ hash ที่มีเลข 0 นำหน้า 12 ตัว
เหนื่อย?
เราสามารถเขียน code ที่ให้คอมฯ เราช่วยวนลูปอันนี้ได้ แต่ว่ามันไม่ทันใจ และไม่ทันคนอื่น
ทางเลือกแรก — Graphic card rigs
ทางเลือกที่สอง — Mining Device
ความสามารถ 14TH/s หรือแปลเป็นภาษามนุษย์ว่า 14,000,000,000,000 hash ต่อวินาที หรือทำไอ้กระบวนการ Proof-of-work 14 ล้านล้านครั้งต่อวินาที
Total Hash Rate ทั้งโลก ในปัจจุบัน (13 Dec 2017) 14,709,608 TH/s หรือ มีไอ้เครื่องข้างบน 1 ล้านตัวทั่วโลก
จุดบอดของ hash function
สิ่งที่ hash function กลัวที่สุด คือ collision หรือ input 2 อันที่แปลงมาเป็น hash ตัวเดียวกัน
สมมติว่ามีคนจะแฮกข้อมูลเรา และได้ hash code ไป hacker ไม่ต้องรู้ password ต้นแบบเรา รู้แค่ input อื่นที่หลัง hash แล้วได้ hash code เดียวกับเรา
hash function อย่าง sha256
จะแสดง output ตายตัวที่ 256-bit
หรือ 64 ตัวอักษร แต่ input มีรูปแบบหลากหลายมากกว่า output เยอะมาก มีโอกาสที่ input 2 แบบ จะกลายเป็น output แบบเดียวกันก็เป็นไปได้
hash function ที่ดี ควรมี collision resistance สูง
MD5 หนึ่งใน hash function ยอดฮิตในสมัยก่อน หลังจากเจอ collision ก็ถูกห้ามใช้กับข้อมูลที่เป็นความลับ
sha256
เป็น hash function ที่ bitcoin ใช้
ถ้าจะ hack sha256
ทำได้ยากมากเมื่อคิดตามความน่าจะเป็นของ 2²⁵⁶
สรุป
hash function คือ one-way function ที่เป็นเบื้องหลัง blockchain เมื่อแปลงข้อมูล input นิดเดียว hash code ที่เป็น output จะเปลี่ยนแปลงไปอย่างสิ้นเชิง
ข้อมูลแต่ละ block ของ blockchain จะพึ่งพิงกับ hash code ข้อมูลของ block ก่อนหน้า ดังนั้นเราจะสร้างข้อมูลหลอกให้เหมือนได้ยากมาก
Proof-of-work คือ การสุ่มเลข input ให้ได้ hash code ที่นำหน้าด้วย 0 ในปริมาณที่ต้องการ
hash function มีข้อที่ควรระวังคือ collision หรือ input 2 ตัวแปลงกลายเป็น hash code ตัวเดียวกัน hash function ที่ดี ควรมี collision resistance สูง สำหรับ bitcoin ที่ใช้ sha256
ยังอยู่ในระดับที่ปลอดภัย