Seed word , seed phrase , recover phrase หรือชื่ออื่นๆที่จะเรียกกัน เพื่อบอกกลุ่มคำ ที่เราเอามาใช้สำหรับการตั้งต้น ก่อนที่จะเอาไปสร้างกระเป๋าต่อไป ซึ่งคนส่วนใหญ่จะเข้าใจว่า มันเป็นคำที่สุ่มขึ้นมา แต่รู้หรือไม่ว่า คำที่สุ่มขึ้นมานั้น ก็มีมาตรฐานกำกับคำพวกนั้นเอาไว้ก่อนแล้วด้วย ก่อนที่เราจะเอามาเลือกใช้สุ่มอีกที และ อีกสิ่งที่หลายคนไม่เคยรู้ก็คือ passphrase ก็ถูกอธิบายเอาไว้ในมาตรฐานนี้ด้วยเช่นกัน มันเป็น combination ที่ทำให้ wallet มีความปลอดภัยมากขึ้นที่หลายคนไม่รู้ หรือไม่เข้าใจว่ามันทำงานอย่างไรครับ
BIP39 บอกอะไรเรา
BIP39 เป็น Standard ที่อธิบายกลุ่มคำ ที่เรามักจะเรียกกันว่า seed word , seed phrase นั่นแหล่ะ โดยเค้าจะอธิบาย กลุ่มคำนี้สร้างขึ้นมาด้วยข้อกำหนดอะไรบ้าง และ มีแนวทางการเอาไปใช้อย่างไร ก่อนที่จะหยิบเอาไปใช้ใน BIP32 ที่อธิบายไปก่อนหน้านี้ใน BIP32 Hierarchical Deterministic Wallets โครงสร้างของ Wallet
กลุ่มคำ mnemonic เกิดมาจากไหน
ต้องบอกว่า คำที่เค้าให้เราเอามาใช้เป็น seed word เนี่ย มันก็มีมาตรฐานตอนที่เลือกมาทำเป็น list ด้วยนะครับ ดังนี้
- เป็นคำที่เลือกมาแล้วอย่างตั้งใจ กล่าวคือ พิมพ์ตัวหนังสือสี่ตัวแรกก็สามารถ selection เต็มคำได้เลยแบบไม่ซ้ำกัน
- ไม่มีคำที่มีความหมายเหมือนกัน หรือ กำกวม เช่น ไม่มี build กับ built หรือ woman กับ women เพื่อลดความสับสน และอาจจะทำให้กรอกผิดๆถูกๆได้ง่ายกว่าด้วย
- เรียงคำทั้งหมดอย่างเป็นลำดับ ต้องอธิบายอย่างนี้ครับ word list ที่เอามาใช้นี้ ตำแหน่ง เป็นสิ่งที่มีความสำคัญ เพราะจริงๆแล้ว ระบบจะไม่ได้เอา word ไป hash แต่อย่างใด แต่มันใช้การเอา word ไปเทียบตำแหน่ง แล้วใช้เลขของตำแหน่งของคำเอาไป hash ต่างหาก ดังนั้นหากเรียงไม่เหมือนกัน อาจจะทำให้เกิดปัญหาการ map ระหว่าง word กลับมาเป็นตัวเลข และทำให้ได้ผิดกระเป๋าได้
Word list ใช้ตัวหนังสือแบบ native ซึ่งจะต้อง encode ใน UTF-8 โดยใช้ การแสดงผลแบบ Normalization Form Compatibility Decomposition (NFKD) อธิบายเรื่องนี้สั้นๆ ก็คือการเปลี่ยนตัวประกอบของตัวหนังสือให้ออกมาเป็นตัวหนังสือและตัวเลขพื้นฐานธรรมดา (สำหรับบางภาษาที่ไม่ได้ใช้ภาษาอังกฤษ)
แปลง mnemonic ให้เป็น seed
องค์ประกอบนี้ ตามมาตรฐานจะมี 2 ส่วน เสมอ คือ mnemonic และ passphrase แต่เวลาที่เราใช้งานหลายๆ wallet จะพบว่า เราไม่สามารถใช้งาน passphrase ได้ (เช่น metamask ไม่มี passphrase มีแต่ password ซึ่งมันไม่เกี่ยวข้องกันเลย) โดย passphrase นี้จะถือว่าเป็น key ลับ ที่เรารู้เพียงคนเดียวมีค่าเดียว ที่นอกเหนือจากรู้ mnemonic word ครบทั้งหมดแล้ว แต่หากไม่มี passphrase ก็จะไม่สามารถเปิดกระเป๋าของเราได้ แต่อย่างไรก็ดี ถ้าระบบใดที่ไม่รองรับ passphrase จะให้ถือว่า passphrase เป็น empty string “” นั่นเองครับ ดังนั้น security จึงลดลง เพียงแค่ทำ seed words หลุด ก็ assumption ว่า seedphrase เป็น empty string ได้เลย ส่วนใหญ่จะโดนกันทั้งนั้น
หลังจากที่เราเลือกคำที่เราจะใช้งานได้แล้ว ขั้นต่อมาคือการแปลง mnemonic ให้เป็น binary ด้วย PBKDF2 โดยข้อมูลที่ป้อน ก็คือ “mnomonic” + passphrase (ที่อยู่ในรูป UTF-8 NFKD ด้วยเหมือนกัน) ให้เป็น salt และใช้การ hash ด้วย HMAC-SHA512 จำนวน 2048 รอบ เพื่อ random ซึ่งผลลัพท์ที่ได้ออกมา ก็จะเอาไปเป็น seed byte ที่ใช้ใน BIP32 นั่นเอง โดยจะได้ key ขนาด 512 bits (64 bytes) นี่แหล่ะ passphrase ถูกใช้ในขั้นตอนนี้เท่านั้น
แต่ถึงอย่างนั้นก็ตาม การเลือกคำมาใช้ เพื่อประกอบเป็น seed phrase (ที่เราต้องใช้ 12 หรือ 24 คำ) ถือว่าเป็นคนละกระบวนการกัน และไม่มีข้อกำหนดตายตัวในการเลือกใช้คำแต่อย่างใด อีกทั้ง จริงๆแล้ว เราจะสร้าง word list ขึ้นมาใหม่เองก็ยังได้เลยด้วยนะ แต่เราต้องเน้นเรื่องที่ว่า เรามีชุด word list ในการเทียบเคียงตำแหน่ง กับ standard ให้ได้ถูกต้อง ก็เท่านั้น (แต่เค้าก็ไม่แนะนำอ่ะนะ)
และกระบวนการแปลงจาก mnemonic ไปเป็น seed bytes นั้น เป็นแบบตรงไปตรงมาและไม่มีการตรวจสอบอะไรภายในด้วย จึงต้องเลือก และกรอก mnemonic ด้วยความระมัดระวังมากๆ เพราะตัวหนังสือ ที่พิมพ์ผิดเพียงตัวเดียว หรือการ encode ที่แตกต่างไป ก็จะทำให้ seed bytes แตกต่างไปได้ ซึ่งมันจะนำเอาไปตั้งต้นสร้างกระเป๋าได้เสมอ แต่ว่าเป็นคนละใบกัน (สร้างออกมาเป็นคนละ master key กัน) ดังนั้น เราอาจจะช่วยผู้ใช้งานได้เพียงแค่ trim หรือ convert ให้เป็น NFKD ก่อนนั่นเอง เพื่อลดความผิดพลาดหรือลบตัวหนังสือที่มองไม่เห็นออก
Wordlist ตาม standard BIP39
ที่ใช้กันอย่างแพร่หลายนั้น จะเป็น wordlist ภาษาอังกฤษ แต่จริงๆแล้วก็มีอีกหลายภาษานะ แต่ว่าก็ไม่แนะนำ เพราะมันจะทำให้เกิดความผิดพลาดได้อย่างที่เล่าไปในบรรทัดข้างบนแล้วนั่นเอง
เค้าเลยแนะนำว่า อย่าไปสร้างเองเลย ก็ใช้ตามที่เค้านิยมใช้กันนั่นแหล่ะ ซึ่งดูได้จาก Wordlists
การสร้าง mnemonic
มีขั้นตอนสำหรับการสร้างและตรวจสอบดังนี้
- เลือกว่าจะใช้กี่ entropy bit ที่อยู่ระหว่าง 128-256 (128 , 160,192,224,256)
- หาร 32 เช่น 128 / 32 จะได้ 4 ก็คือ checksum
- เอา entropy บวก checksum เช่น 128+4 = 132
- นำข้อ 3 หาร 11 จะได้จำนวนคำ ก็คือ 132/11 = 12 คำ
และจากตารางนี้ จะเห็นได้ว่า จริงๆแล้ว mnemonic ไม่ได้มีแค่ 12 หรือ 24 คำเท่านั้นนะครับ
| ENT | CS | ENT+CS | MS |
+——-+—-+——–+——+
| 128 | 4 | 132 | 12 |
| 160 | 5 | 165 | 15 |
| 192 | 6 | 198 | 18 |
| 224 | 7 | 231 | 21 |
| 256 | 8 | 264 | 24 |
แต่มีได้ 12 15 18 21 24 คำ
จบแล้วครับ สำหรับ BIP39 เรื่องที่ดูเหมือนจะง่าย แต่ก็มีความซับซ้อน และมีมาตรฐานกำหนดได้อยู่เหมือนกัน จะเห็นได้ว่า จริงๆมี passphrase ซ่อนอยู่ที่จะช่วยเพิ่ม security ได้ด้วย แต่ส่วนใหญ่ เราจะไม่ได้ใช้งานกัน เพราะมันเริ่มจะยุ่งยาก ลำพังแค่ seed word ก็จดกันยุบยับแล้ว ถ้าต้องจำ passphrase อีกด้วย ก็น่าจะมึนไปอีก แล้วที่สำคัญที่สุด ถ้า passphrase หายหรือจำไม่ได้ หรือลืม ก็แทบจะต้องทิ้ง wallet นั้นกันไปเลยทีเดียว (มีหลายคนที่เจอกับตัวมาแล้ว เปิดใช้งานครั้งแรก แต่จำไม่ได้ สุดท้ายเปิด wallet เดิมไม่ได้ทั้งที่มี seed word ครบทุกคำพร้อมตำแหน่งที่ถูกต้องก็ตามเพราะลืม passphrase)