Nonce ในโลกคริปโตคืออะไร? การขุด Bitcoin, Ethereum, การเข้ารหัสลับ
ในเดือนธันวาคม 2010 บนเวทีงาน Chaos Communication Congress ในกรุงเบอร์ลิน กลุ่มเล็กๆ กลุ่มหนึ่งชื่อ fail0verflow ประกาศว่าพวกเขาได้ถอดรหัสมาสเตอร์ซิกเนเจอร์ของ Sony สำหรับ PlayStation 3 ได้แล้ว ช่องโหว่นี้ไม่ได้ทำลายเส้นโค้งวงรี 256 บิต หรือถอดรหัส AES แต่ใช้ประโยชน์จากข้อเท็จจริงที่ว่าระบบการลงนามรหัสของ Sony ใช้หมายเลขเดียวกันซ้ำสำหรับทุกการลงนามที่สร้างขึ้น หมายเลขนั้นคือ nonce
คำว่า "nonce" ปรากฏอยู่ในสามมุมของโลกคริปโตเคอร์เรนซีที่แทบไม่มีอะไรเหมือนกันเลย มันคือตัวแปรที่นักขุด Bitcoin วนซ้ำหลายล้านล้านครั้งต่อวินาทีเพื่อค้นหาแฮชบล็อกที่ถูกต้อง มันคือตัวนับที่กระเป๋าเงิน Ethereum ของคุณใช้ในการจัดลำดับธุรกรรมขาออก และเป็นเหตุผลที่ทำให้ธุรกรรมที่ติดขัดบล็อกทุกธุรกรรมที่คุณลงนามในภายหลัง และมันคือค่าเฉพาะที่การเข้ารหัส AES-GCM ต้องการเพื่อป้องกันไม่ให้ข้อความที่เข้ารหัสสองข้อความรั่วไหลเนื้อหาของกันและกัน หนึ่งคำ สามหน้าที่ ไม่มีอะไรใช้แทนกันได้ การเข้าใจผิดระหว่างสองสิ่งนี้ทำให้ผู้เริ่มต้นอ่านข้อผิดพลาด "nonce too low" ผิดพลาด ทำให้นักขุดออกแบบระบบที่ทำไม่ได้จริง และทำให้ระบบอย่าง PS3 สูญเสียรากฐานความน่าเชื่อถือไป
ค่า nonce ขนาด 32 บิตที่เรียกว่า "number used once": origin
คำย่อที่มาจากรากศัพท์เดียวกันนี้พบเห็นได้ทั่วไป "Nonce ย่อมาจาก number used once" (หมายเลขที่ใช้เพียงครั้งเดียว) ซึ่งก็จริงอยู่บ้าง แต่ในเชิงประวัติศาสตร์นั้นผิดพลาด คำภาษาอังกฤษคำนี้มีมาก่อนการเข้ารหัสลับประมาณ 750 ปี วลี "For the nonce" ปรากฏในต้นฉบับภาษาอังกฤษยุคกลางราวปี 1200 ซึ่งหมายถึง "สำหรับโอกาสนี้โดยเฉพาะ"
วิทยาการเข้ารหัสลับได้ยืมคำนี้มาใช้ในปี 1978 ในโปรโตคอลการตรวจสอบความถูกต้องของ Needham-Schroeder โดยคุณสมบัติที่สำคัญไม่ใช่ความสุ่ม แต่เป็นความเป็นเอกลักษณ์ภายในขอบเขตที่กำหนดไว้ วิกิพีเดียอ้างอิงจากการใช้งานจริง เรียก nonce ว่า "ตัวเลขใดๆ ที่สามารถใช้ได้เพียงครั้งเดียวในการสื่อสารทางการเข้ารหัสลับ" ตัวนับก็เข้าข่าย เช่นเดียวกับเวลาประทับ เช่นเดียวกับค่าสุ่ม หรือการผสมผสานของทั้งสามอย่าง สิ่งที่สำคัญคือ ภายในระบบ nonce เดียวกันจะไม่ปรากฏซ้ำอีกกับกุญแจเดียวกัน หรือในบริบทเดียวกัน
คำเพียงคำเดียวก็เพียงพอต่อการทำงาน และงานนั้นจะถูกแบ่งออกเป็นสามส่วน ค่า nonce ในการขุด Bitcoin จะเปลี่ยนแปลงไปเรื่อยๆ จนกว่าค่าแฮชของบล็อกจะลดลงต่ำกว่าเป้าหมายความยาก ส่วนค่า nonce ในบัญชีของ Ethereum เป็นตัวนับที่เครือข่ายจะไม่ยอมให้ใช้ซ้ำ ค่า nonce ในการเข้ารหัสแบบสมมาตรเป็นค่าที่จับคู่กับกุญแจ และการนำค่านี้ไปใช้ซ้ำเพียงครั้งเดียวจะทำให้การเข้ารหัสถูกทำลาย
คำว่า "ความหมาย" นั้นค่อนข้างไม่ชัดเจน แต่บริบทนั้นไม่เป็นเช่นนั้น

nonce ทำงานอย่างไรในการขุด Bitcoin
ในบิตคอยน์ ค่า nonce จะใช้พื้นที่ 32 บิตภายในส่วนหัวของบล็อกขนาด 80 ไบต์ สี่ไบต์ ค่าจะอยู่ระหว่างศูนย์ถึง 4,294,967,295 รวมแล้วเกือบ 4.3 พันล้านตัวเลข ซึ่งฟังดูมหาศาลเมื่อซาโตชิเขียนโปรโตคอลนี้ขึ้นมา แต่ปัจจุบันชิป ASIC ขนาดเท่าโต๊ะทำงานสามารถประมวลผลได้ภายในเวลาไม่กี่ไมโครวินาที
การขุดเหรียญคือการแข่งขันเพื่อค้นหาค่าในฟิลด์นั้นที่สร้างแฮชบล็อกที่ถูกต้อง ลองนึกถึงส่วนหัวขนาด 80 ไบต์ นำไปผ่านฟังก์ชันแฮชเข้ารหัสลับ SHA-256 ซึ่งเป็นฟังก์ชันที่ใช้ในบล็อกเชนของบิตคอยน์ สองครั้ง จะได้ตัวเลข 256 บิตออกมา เปรียบเทียบตัวเลขนั้นกับแฮชเป้าหมายที่กำหนดโดยเป้าหมายความยากของเครือข่าย ซึ่งเป็นกลไกฉันทามติที่ขับเคลื่อนการพิสูจน์การทำงาน ถ้าต่ำกว่าเป้าหมาย บล็อกนั้นถูกต้อง ผู้ขุดชนะ ถ้าสูงกว่าเป้าหมาย ให้เพิ่มค่า nonce ขึ้นหนึ่งแล้วคำนวณแฮชใหม่ ผู้ขุดบิตคอยน์จะทำซ้ำกระบวนการนี้จนกว่าจะมีคนพบค่า nonce ที่ถูกต้อง และบล็อกใหม่จะถูกเพิ่มเข้าไปในบล็อกเชน
ทำไมถึงใช้ฟิลด์เล็ก ๆ แบบนี้สำหรับงานใหญ่ขนาดนี้? เหตุผลเชิงโครงสร้างครับ ค่า nonce เป็นส่วนประกอบที่ถูกที่สุดในส่วนหัวของบล็อกที่นักขุดสามารถเปลี่ยนแปลงได้ ฟิลด์อื่น ๆ ล้วนมีส่วนที่พึ่งพาซึ่งกันและกัน ค่า merkle root สรุปธุรกรรมของบล็อก ดังนั้นการเปลี่ยนแปลงค่านี้จะบังคับให้โครงสร้างธุรกรรมทั้งหมดต้องคำนวณใหม่ก่อนที่จะลองสร้างแฮชใหม่ได้ แต่ค่า nonce ช่วยหลีกเลี่ยงขั้นตอนเหล่านั้น การลองสร้างแฮชแต่ละครั้งเป็นอิสระต่อกัน การเพิ่มค่า nonce ไม่ได้ทำให้ได้ผลลัพธ์ที่ดีขึ้นไปกว่าการเลือกค่าแบบสุ่ม เป็นการใช้กำลังแบบดั้งเดิมที่มาในรูปแบบของภาษาฉันทามติ
การออกแบบนี้ใช้งานได้ดีประมาณหนึ่งปี จากนั้น ASIC ก็เข้ามาทำลายมัน เครื่องขุดสมัยใหม่ใช้พื้นที่ nonce ทั้งหมด 4.3 พันล้านค่าหมดภายในเวลาไมโครวินาที ไม่ใช่วินาที เครื่องขุด Bitmain Antminer S21 Pro ทำงานที่ 234 เทราแฮชต่อวินาที พื้นที่ nonce ทั้งหมดจะหมดลงบนฮาร์ดแวร์นั้นภายในเวลาประมาณ 18 ไมโครวินาที ณ เดือนพฤษภาคม 2026 อัตราแฮชรวมของเครือข่าย Bitcoin อยู่ที่ประมาณ 996 EH/s โดยมีความยากอยู่ที่ 132.47 ล้านล้าน เครื่อง S21 Pro เพียงเครื่องเดียวใช้ค่า nonce ที่เป็นไปได้ทั้งหมดหลายหมื่นครั้งต่อวินาที
ดังนั้น โปรโตคอลของซาโตชิจึงเปิดทางออกที่ชัดเจนสองทางให้แก่ผู้ขุด เมื่อพื้นที่ 32 บิตหมดลง ทางออกแรกคือ "nonce พิเศษ" ซึ่งเป็นฟิลด์ที่ซ่อนอยู่ภายใน scriptSig ของธุรกรรม coinbase โดย BIP34 เป็นตัวกำหนด ฟิลด์นี้มีขนาดตั้งแต่ 2 ถึง 100 ไบต์ ซึ่งผู้ขุดสามารถควบคุมได้ หากเปลี่ยนแปลง nonce พิเศษนี้ TXID ของ coinbase จะเปลี่ยนไป ต้องคำนวณ merkle root ใหม่ ส่วนหัวของบล็อกจะเปลี่ยนไป และต้องเริ่มการค้นหา nonce 32 บิตใหม่ ทางออกที่สองคือการเพิ่มค่า timestamp หรือหมุนบิตเวอร์ชันภายในช่วงที่โปรโตคอลอนุญาต ปัจจุบันพูลการขุดจะหมุนเวียนทั้งหมดนี้เป็นส่วนหนึ่งของการทำงานปกติ การปรับ nonce เป็นการเปลี่ยนแปลงที่ถูกที่สุด การปรับ nonce พิเศษเป็นการเปลี่ยนแปลงที่ถูกที่สุดเป็นอันดับสอง การหมุน merkle และ timestamp นั้นใช้เวลานานกว่า โดยเรียงลำดับตามปริมาณงานที่ต้องคำนวณใหม่
เมื่อมีคนขุดได้ค่าแฮชต่ำกว่าเป้าหมาย (นักขุดเรียกมันว่า "โกลเด้น นอนซ์") บล็อกใหม่จะถูกส่งออกไปทั่วเครือข่ายแบบเพียร์ทูเพียร์ และผู้แข่งขันทุกคนจะหยุดการค้นหาปัจจุบันเพื่อเริ่มต้นใหม่ในรอบถัดไป
| โมเดล ASIC | อัตราแฮช | ถึงเวลาใช้ nonce 32 บิตให้หมด | ประสิทธิภาพ |
|---|---|---|---|
| แอนท์ไมเนอร์ เอส21 | 200 TH/s | ~21 ไมโครวินาที | 17.5 J/TH |
| แอนท์ไมเนอร์ S21 โปร | 234 TH/s | ~18 ไมโครวินาที | 15 J/TH |
| แอนท์ไมเนอร์ S21 XP | 270 TH/s | ~16 ไมโครวินาที | 13.5 J/TH |
ตัวอย่างจริงล่าสุดช่วยยืนยันแนวคิดเชิงนามธรรมนี้ได้ บล็อกที่ 948,000 ซึ่งขุดได้ในช่วงต้นปี 2026 มีแฮชบล็อกเป็น `00000000000000000001b01841afc366a4f999b291c8563ee0d0db956fc2db44` และค่า nonce ที่ชนะคือ 2,582,463,598 ตัวเลขจำนวนเต็มตัวเดียวนี้ เมื่อรวมกับส่วนหัวของบล็อกที่เหลือ จะได้แฮชที่ต่ำพอที่จะถูกเพิ่มเข้าไปในบล็อกเชนได้ ในขณะที่ค่า nonce อื่นๆ ที่ผู้ขุดลองใช้ในรอบนั้นให้ค่าที่ใหญ่เกินไป
นี่คือความหมายของหลักฐานการทำงาน (Proof of Work) ในเชิงกลไก ไม่ใช่ปริศนาในความหมายที่ซับซ้อน มันคือการค้นหาค่า nonce ที่ถูกต้อง ซึ่งใช้พลังงานไฟฟ้าเป็นค่าใช้จ่าย
Hash nonce กับ account nonce: คำเดียวกัน แต่หน้าที่ต่างกัน
คำว่า "nonce" ถูกนำมาใช้ซ้ำในความหมายอื่นในวงการคริปโตเคอร์เรนซี และความซ้ำซ้อนนี้เป็นแหล่งที่มาของความสับสนที่ใหญ่ที่สุดในหมู่ผู้มาใหม่ nonce สำหรับการขุด Bitcoin คือตัวแปรในการค้นหา ส่วน nonce สำหรับบัญชี Ethereum คือตัวนับ พวกมันมีชื่อเหมือนกัน แต่แทบไม่มีอะไรเหมือนกันเลย
| แฮช นอนซ์ (บิทคอยน์) | ค่า nonce ของบัญชี (Ethereum) | |
|---|---|---|
| งาน | ค้นหาแฮชที่ถูกต้องด้านล่างเป้าหมาย | เรียงลำดับรายการธุรกรรมขาออกตามบัญชี |
| ที่ที่มันอาศัยอยู่ | ส่วนหัวของบล็อก (32 บิต) | สถานะบัญชี (จำนวนเต็ม เริ่มต้นที่ 0) |
| ใครเป็นผู้ทำให้มันกลายพันธุ์ | เครื่องขุดเหรียญดิจิทัลนั้น ในทางฮาร์ดแวร์ สามารถประมวลผลได้หลายพันล้านต่อวินาที | กระเป๋าเงินจะส่งข้อมูลโดยอัตโนมัติครั้งละหนึ่งรายการต่อการส่งหนึ่งครั้ง |
| คำว่า "ผิด" หมายความว่าอย่างไร | ถ้าสลากกินแบ่งรัฐบาลไม่ถูก ลองสลากใบต่อไปดู | ธุรกรรมถูกปฏิเสธหรือติดขัด |
| ผูกพันกับฉันทามติ? | ใช่ นี่คือหลักฐานการทำงาน | ไม่ นี่คือระบบป้องกันการเล่นซ้ำ |
แฮช นอนซ์ (hash nonce) คือหมายเลขชั่วคราวที่นักขุดทิ้งไป ในขณะที่ บัญชี นอนซ์ (account nonce) คือสถานะถาวรที่ถูกบันทึกไว้ในมุมมองของเครือข่ายต่อที่อยู่ของคุณ การสับสนระหว่างสองสิ่งนี้ — การมองว่าบล็อกเชน นอนซ์ ของบล็อก Bitcoin เหมือนกับตัวนับลำดับ — คือวิธีที่ผู้คนอ่านข้อผิดพลาด "nonce too low" ของ Ethereum และคิดว่าการตั้งค่าการขุดของพวกเขามีปัญหา บล็อกเชนต่างกัน งานต่างกัน แต่คำเดียวกัน แม้แต่ในระบบนิเวศเดียวกัน บทบาทของนอนซ์ในการทำงานของบล็อกเชนก็ขึ้นอยู่กับว่าคุณกำลังดูเลเยอร์ฉันทามติหรือเลเยอร์บัญชี
nonce ของบัญชี Ethereum และปัญหาธุรกรรมค้าง
บัญชีภายนอกทุกบัญชีบน Ethereum จะมีหมายเลข nonce ของตัวเอง หมายเลข nonce จะเริ่มต้นที่ศูนย์ ในครั้งแรกที่ที่อยู่ดังกล่าวส่งธุรกรรม จากนั้นจะเพิ่มขึ้นทีละหนึ่งสำหรับทุกธุรกรรมที่บันทึกอยู่ในบล็อก เมื่อคุณส่งอะไรบางอย่าง กระเป๋าเงินของคุณจะขอค่าปัจจุบันจากเครือข่าย เพิ่มหมายเลขถัดไปในลำดับ และลงนาม เครือข่ายจะยอมรับเฉพาะคิวขาออกตามลำดับที่เข้มงวดเท่านั้น คือ nonce 0 จากนั้น 1 จากนั้น 2 ไม่อนุญาตให้มีช่องว่าง
ลำดับที่เข้มงวดนี้เองที่ทำให้ Ethereum มีระบบป้องกันการโจมตีแบบ Replay ธุรกรรมที่ลงนามแล้วจะผูกติดกับค่า nonce เฉพาะค่าหนึ่ง และตั้งแต่ EIP-155 เป็นต้นมา ก็จะผูกติดกับค่า chainID เฉพาะค่าหนึ่งด้วย ผู้โจมตีไม่สามารถส่งธุรกรรมที่ดำเนินการไปแล้วซ้ำได้ราวกับว่าเป็นธุรกรรมใหม่ เมื่อการส่งซ้ำมาถึง ค่า nonce ของบัญชีนั้นก็จะเปลี่ยนแปลงไปแล้ว ค่า chainID ยังช่วยป้องกันการโจมตีแบบ Replay ข้ามเชนได้ในเวลาเดียวกัน ภายในเชนเดียวกัน ธุรกรรมที่ได้รับการยืนยันแล้วจะอยู่ที่จุดหนึ่งบนตัวนับที่เปลี่ยนแปลงไปแล้ว
ลำดับการดำเนินการที่ตายตัวแบบเดียวกันนี้เองที่ก่อให้เกิดปัญหาที่กระเป๋าเงิน Ethereum ใหม่ๆ มักพบเจออยู่เสมอ ธุรกรรมถูกส่งออกไปโดยมีค่าทิปต่ำเกินไป ผู้ตรวจสอบความถูกต้องจะส่งต่อให้ระบบ mempool จะตัดธุรกรรมนั้นออกจากคิวลำดับความสำคัญ ธุรกรรมนั้นจึงอยู่ในสถานะที่ไม่แน่นอน — ไม่ได้รับการยืนยัน ไม่ล้มเหลว แต่ถูกทิ้งไว้ ที่แย่กว่านั้นคือ ธุรกรรมต่อๆ ไปที่ส่งไปยังที่อยู่เดียวกันจะได้รับค่า nonce ที่สูงขึ้น เครือข่ายจะไม่ยอมแตะต้องธุรกรรมเหล่านั้นจนกว่าธุรกรรมที่ค้างอยู่จะได้รับการยืนยันหรือถูกแทนที่ ธุรกรรมที่ช้าเพียงรายการเดียวก็ทำให้คิวทั้งหมดหยุดชะงักได้
วิธีแก้ปัญหานี้อยู่ในกลไกที่เรียกว่า replace-by-fee กระเป๋าเงินของคุณจะส่งธุรกรรมใหม่ไปยังหมายเลข nonce เดียวกัน กับธุรกรรมที่ค้างอยู่ แต่ใช้ค่า gas ที่สูงกว่า EIP-1559 ซึ่งเป็นแบบจำลองการกำหนดราคา gas ที่ใช้ใน Ethereum ตั้งแต่การอัปเกรด London ในเดือนสิงหาคม 2021 กำหนดกฎไว้ว่า ธุรกรรมใหม่จะต้องเพิ่มทั้ง `maxFeePerGas` และ `maxPriorityFeePerGas` อย่างน้อยสิบเปอร์เซ็นต์จากธุรกรรมเดิม หากต้องการยกเลิกธุรกรรมที่ค้างอยู่โดยตรงแทนที่จะแทนที่ ให้ส่งการโอน ETH เป็นศูนย์ไปยังหมายเลข nonce ที่ค้างอยู่ด้วยค่า tip ที่สูงกว่า ช่องนั้นจะถูกใช้ไป และธุรกรรมในคิวถัดไปทั้งหมดจะถูกปลดบล็อก
ตัวเลขเดือนพฤษภาคม 2026 เพื่อเป็นข้อมูลประกอบ ค่าธรรมเนียมเฉลี่ยสำหรับลำดับความสำคัญอยู่ที่ประมาณ 1.875 Gwei การยกเลิกคำสั่งซื้อก๊าซ 21,000 รายการมาตรฐานจะมีค่าใช้จ่ายประมาณ 0.05 ดอลลาร์ในวันที่การจราจรไม่ติดขัด และจะสูงขึ้นเป็นหลายดอลลาร์ในช่วงที่มีการจราจรหนาแน่น มีบทเรียนหนึ่งที่ทุกคนต้องเรียนรู้ในที่สุดด้วยความยากลำบาก นั่นคือ ควรแทนที่ nonce ที่รอการดำเนินการ ที่ต่ำที่สุด ก่อนเสมอ การเพิ่มค่าธรรมเนียมในการทำธุรกรรมในภายหลังในขณะที่รายการก่อนหน้ายังคงค้างอยู่จะไม่ก่อให้เกิดประโยชน์ใดๆ เลย
การนำแนวคิดนามธรรมของบัญชีมาใช้ทำให้เรื่องราวนี้เปลี่ยนไปเล็กน้อย บัญชีอัจฉริยะ ERC-4337 ใช้ nonce แบบ 2 มิติ โดยแบ่งจำนวนเต็มออกเป็น "คีย์" 192 บิต และลำดับ 64 บิต คีย์ที่แตกต่างกันจะสร้างกระแสธุรกรรมแบบขนาน ชุดข้อมูลที่หยุดชะงักบนคีย์หนึ่งจะไม่ขัดขวางการทำงานของคีย์อื่น ในที่สุด nonce ของบัญชีก็พัฒนาไปไกลกว่าการเป็นเพียงตัวนับเชิงเส้นตัวเดียวแล้ว
อีกหนึ่งความเข้าใจผิดที่ควรลบล้าง การเปลี่ยนผ่านของ Ethereum ไปสู่ระบบ Proof of Stake ในช่วงการรวมระบบ (Merge) ในเดือนกันยายน 2022 ไม่ได้ทำให้ค่า Nonce ของบัญชีหายไป สิ่งที่หายไปคือค่า Nonce ของการขุด ภายในส่วนหัวของบล็อก เนื่องจากตอนนี้ผู้ตรวจสอบความถูกต้องจะถูกเลือกโดยสล็อตแทนที่จะเป็นการแก้ปริศนาแฮช ค่า Nonce ของบัญชีจึงยังคงอยู่ที่เดิมในโครงสร้างข้อมูล Trie ของสถานะบัญชี
ค่า nonce ทางการเข้ารหัส: เวอร์ชันหายนะ
หากมองข้ามกรอบของบล็อกเชนไป ค่า nonce ทางการเข้ารหัสจะทำงานได้แม่นยำยิ่งขึ้น แต่ถ้าผิดพลาด ทุกอย่างก็จะพังทลายลง
ระบบเข้ารหัสลับที่ทันสมัยทุกระบบจะจับคู่กุญแจลับกับค่า nonce ต่อข้อความ AES-GCM ซึ่งเป็นระบบหลักที่ใช้ใน TLS 1.3 ใช้ค่า nonce ขนาด 96 บิต NIST SP 800-38D เป็นผู้เขียนข้อกำหนด ส่วน ChaCha20-Poly1305 ซึ่งเป็นทางเลือกอื่นที่กำหนดไว้ใน RFC 8439 (มิถุนายน 2018) ก็ใช้ค่า nonce ขนาด 96 บิตเช่นเดียวกัน แต่จับคู่กับกุญแจขนาด 256 บิต กฎของทั้งสองระบบโดยสรุปคือ คู่ (กุญแจ, nonce) แต่ละคู่จะทำงานเพียงครั้งเดียวเท่านั้น การนำกลับมาใช้ซ้ำไม่ใช่การลดประสิทธิภาพแบบค่อยเป็นค่อยไป แต่เป็นการลดประสิทธิภาพแบบสุดขั้ว
หน้าผาแห่งความเสี่ยงมีลักษณะอย่างไร? ลองนึกภาพว่าผู้โจมตีได้ดักจับข้อความที่เข้ารหัสทั้งสองชุดแล้วนำมา XOR กัน ผลลัพธ์ที่ได้คือค่า XOR ของข้อความต้นฉบับทั้งสองชุด ความลับของข้อมูลหายไปในพริบตา และสิ่งที่แย่กว่านั้นก็คือ โหมดการตรวจสอบความถูกต้องของ GCM รั่วไหลคีย์ย่อยภายใน ซึ่งเป็นค่าที่ใช้ลงนามข้อความที่เข้ารหัสทุกชุดภายใต้คีย์นั้น เมื่อผู้โจมตีได้คีย์ย่อยนี้แล้ว พวกเขาสามารถเขียนข้อความที่เข้ารหัสใหม่ที่ได้รับการตรวจสอบความถูกต้อง และผู้รับที่ถูกต้องก็จะยอมรับว่าเป็นของจริง แม้แต่การเข้ารหัสที่ทันสมัยที่สุด หากใช้ nonce ที่ผิดพลาดเพียงตัวเดียว ก็ยังมีความเสี่ยงต่ำกว่าระดับ Caesar shift
ทั้งหมดนี้ไม่ใช่เรื่องสมมติ รายงาน USENIX WOOT ปี 2016 เรื่อง "Nonce-Disrespecting Adversaries" ได้สแกนเอนด์พอยต์ HTTPS ที่ใช้งานจริงและพบเซิร์ฟเวอร์ 184 เครื่องที่ใช้ nonce ของ GCM ซ้ำกัน เวอร์ชันที่มีข้อบกพร่องนั้นรวมถึงอิมเมจ Cisco IOS XE และเฟิร์มแวร์ Radware ADC บางรุ่น CVE-2016-0270 และ CVE ที่เกี่ยวข้องอีกหลายรายการได้ติดตามเซิร์ฟเวอร์เหล่านี้อยู่
เหตุการณ์แฮ็กเครื่อง PS3 ของ Sony ในเดือนธันวาคม 2010 เกิดจากสาเหตุเดียวกัน แต่ใช้การเข้ารหัสแบบ ECDSA แทน ลายเซ็น ECDSA ทุกตัวจำเป็นต้องมีค่าเฉพาะตัวที่เรียกว่า k ซึ่งเป็นค่าที่ไม่ซ้ำกันและเป็นความลับ แต่โค้ดการลงนามของ Sony ข้ามส่วนที่ไม่ซ้ำกันนี้ไป มันกำหนด ค่า k คงที่ไว้และนำมาใช้ซ้ำกับทุกลายเซ็น หากผู้โจมตีมีลายเซ็น ECDSA สองชุดที่ใช้ข้อความต่างกันแต่มี ค่า k เดียวกัน พวกเขาก็จะได้สมการเชิงเส้นสองสมการที่มีตัวแปรสองตัว เมื่อแก้สมการแล้ว ก็จะได้กุญแจลงนามส่วนตัวในรูปแบบปิด fail0verflow ได้อธิบายเรื่องนี้บนเวทีในงาน Chaos Communication Congress ครั้งที่ 27 ที่เบอร์ลิน กุญแจลงนามหลักของ Sony หลุดออกสู่สาธารณะภายในไม่กี่ชั่วโมง ทำให้เครื่อง PS3 ทุกเครื่องที่เคยผลิตมาสูญเสียความน่าเชื่อถือไปพร้อมกัน
วิธีแก้ปัญหาแบบกำหนดค่าได้ (deterministic fix) ซึ่งบัญญัติไว้ใน RFC 6979 ในปี 2013 นั้น จะนำตัวสร้างเลขสุ่ม (random number generator) ออกจากกระบวนการ โดยจะหา ค่า k จาก HMAC ของข้อความและคีย์ส่วนตัว ข้อความเดียวกัน คีย์เดียวกัน ค่า k เดียวกัน — ไม่มีตัวสร้างเลขสุ่มให้เสียหาย ไลบรารี Bitcoin รุ่นใหม่ๆ จึงใช้ ECDSA แบบกำหนดค่าได้เป็นค่าเริ่มต้น
จากเรื่องราวเหล่านี้มีข้อสรุปสองประการที่มักทำให้ผู้พัฒนาสับสน สำหรับรหัส AEAD (AES-GCM, ChaCha20-Poly1305) ค่า nonce ที่คาดเดาได้นั้นใช้ได้ดี ตัวนับก็ใช้ได้ ความต้องการทั้งหมดอยู่ที่ความเป็นเอกลักษณ์ แต่สำหรับลายเซ็น ECDSA และ Schnorr กฎกลับพลิกผัน ค่า k ที่คาดเดาได้นั้นเป็นหายนะ ค่า nonce ที่ใช้ในการลงนามจะต้องเป็นเอกลักษณ์ คาดเดาไม่ได้ และเป็นความลับในเวลาเดียวกัน การผสมผสานสองอย่างนี้เข้าด้วยกันคือสาเหตุที่ทำให้เกิดบั๊กการใช้ nonce ซ้ำในโค้ดกระเป๋าเงินดิจิทัลแบบกำหนดเอง รายงานการตรวจสอบปี 2024 ของโครงการสำรองข้อมูล Kopia พบความเสี่ยงจากการชนกันของ GCM-nonce แบบสุ่มในคีย์ที่ใช้งานมานาน และรายงานการทดสอบเจาะระบบของ SDK รุ่นใหม่ๆ ก็พบข้อค้นพบที่คล้ายกันทุกเดือน
Nonce เทียบกับ salt เทียบกับ IV: หลีกเลี่ยงความสับสนระหว่างสามอย่างนี้
คนมักใช้สามคำนี้ในเอกสารด้านความปลอดภัยราวกับว่ามันมีความหมายเหมือนกัน เช่น Salt, Nonce, IV แต่จริงๆ แล้วมันไม่ใช่คำที่มีความหมายเหมือนกัน
Salt เป็นส่วนหนึ่งของการเข้ารหัสรหัสผ่าน คุณจะใช้ค่าสุ่มเฉพาะผู้ใช้แต่ละคน ผสมมันเข้าไปในค่าแฮช และตอนนี้ตารางเรนโบว์ที่คำนวณไว้ล่วงหน้าสำหรับ "password123" จะใช้ไม่ได้ผลกับฐานข้อมูลของคุณอีกต่อไป Salt จะอยู่ในรูปแบบข้อความธรรมดาข้างๆ ค่าแฮช ไม่มีใครซ่อนมัน การที่ผู้ใช้สองคนใช้ Salt ร่วมกันนั้นเป็นเรื่องที่ยุ่งยาก เพราะมันทำให้ผู้โจมตีที่เจาะระบบของคนใดคนหนึ่งได้ ก็สามารถเจาะระบบของอีกคนได้เช่นกัน แต่มันก็ไม่ใช่เรื่องร้ายแรงอะไร
Nonce เกี่ยวข้องกับการส่งข้อความและลายเซ็น ในระบบเข้ารหัสแบบสมมาตรจะใช้ Nonce ต่อข้อความ ในระบบเข้ารหัสแบบ ECDSA จะใช้ Nonce ต่อลายเซ็น การเข้ารหัสแบบ AEAD เช่น AES-GCM จะแสดง Nonce ออกมาอย่างชัดเจน เหมือนกับที่ Salt แสดงอยู่ข้างๆ ค่าแฮช ในขณะที่ ECDSA จะซ่อน Nonce ไว้ ถือว่าเป็นความลับ และต้องการค่าสุ่มใหม่ทุกครั้ง ไม่ว่าจะด้วยวิธีใด การชนกันของ Nonce ก็ไม่ใช่แค่เรื่องน่าอึดอัด แต่เป็นเรื่องร้ายแรง การรับประกันทั้งหมดก็จะหายไป
IV — ย่อมาจาก initialization vector — เป็นชื่อเดิมของสิ่งที่ข้อกำหนดใหม่เรียกว่า nonce โหมด CBC และ CTR ใช้คำนี้มานานหลายปีแล้ว เอกสาร AEAD ฉบับใหม่เปลี่ยนมาใช้คำว่า "nonce" ส่วนใหญ่เป็นเพราะคำว่า "vector" ฟังดูเหมือนการบ้านคณิตศาสตร์ และผู้คนก็ใช้ซ้ำกันอยู่เรื่อย ๆ คำว่า "nonce" ยึดหลักกฎเกณฑ์ได้ดีกว่า
ต้องการกฎง่ายๆ สักข้อที่เขียนลงบนกระดาษโน้ตได้ไหม? เกลือ (Salt) ช่วยปกป้องความลับที่คุณเก็บไว้ ส่วนรหัสสุ่ม (Nonce) ช่วยปกป้องความลับที่คุณส่งออกไป

เหตุใดค่า nonce จึงมีความสำคัญนอกเหนือจากเรื่องเล็กน้อยเกี่ยวกับการขุดบิตคอยน์
Nonce คือวัตถุขนาดเล็ก 32 บิตใน Bitcoin ตัวนับใน Ethereum 12 ไบต์ใน AES-GCM มันมีความสำคัญเกินสัดส่วนเมื่อเทียบกับขนาด สำหรับผู้ใช้งานทั่วไป ทุกธุรกรรม Ethereum ที่ติดขัด ทุกการเชื่อมต่อ TLS กับเว็บไซต์ธนาคาร ทุกลายเซ็นที่กระเป๋าเงินฮาร์ดแวร์สร้างขึ้น ล้วนขึ้นอยู่กับการจัดการ nonce อย่างถูกต้อง สำหรับนักพัฒนา การจัดการ nonce ผิดพลาดเป็นจุดเริ่มต้นที่พบบ่อยที่สุดสำหรับข้อผิดพลาดร้ายแรงในโค้ดการเข้ารหัสแบบกำหนดเอง เหตุการณ์ PS3 เป็นกรณีสุดขั้ว แต่โหมดความล้มเหลวแบบเดียวกันนี้ยังคงปรากฏใน SDK กระเป๋าเงินรุ่นใหม่และเครื่องมือสำรองข้อมูล สำหรับเศรษฐศาสตร์ของ Bitcoin nonce 32 บิตที่รวมกับกลไก nonce พิเศษ คือสิ่งที่ทำให้การขุด ASIC เป็นการเสี่ยงโชคที่ยุติธรรมตั้งแต่แรก หนึ่งในทางเลือกการออกแบบที่สำคัญที่สุดของ Satoshi ซ่อนอยู่ภายในฟิลด์ส่วนหัวที่ไม่โดดเด่น
ค่า nonce คือสิ่งที่บอกว่า เหตุการณ์นี้เคยเกิดขึ้นครั้งหนึ่ง ในลำดับนี้ และในลักษณะนี้อย่างแน่นอน หากไม่มี ค่า nonce ระบบทุกระบบที่พึ่งพาความเฉพาะตัวจะพังทลายลง และกลายเป็นสิ่งที่ผู้โจมตีสามารถสร้างขึ้นใหม่ได้อย่างง่ายดาย ความเห็นพ้องต้องกันจะพังทลาย การป้องกันการโจมตีซ้ำจะหายไป การเข้ารหัสจะรั่วไหล ลายเซ็นจะถูกปลอมแปลง