Horcrux: แบ่งไฟล์ออกเป็นชิ้นส่วนที่เข้ารหัสไว้
(github.com/jesseduffield)- Horcrux เป็นเครื่องมือ CLI ที่แบ่งไฟล์ออกเป็น ชิ้นส่วน horcrux ที่เข้ารหัสไว้ และช่วยให้สามารถกู้คืนไฟล์ต้นฉบับได้โดยไม่ต้องจำรหัสผ่าน
- เหมาะสำหรับผู้ใช้ที่ต้องเข้ารหัสไฟล์สำคัญขนาดใหญ่ แต่กังวลว่าอีกหลายปีข้างหน้าอาจจำรหัสผ่านไม่ได้ รวมถึงผู้ที่ต้องการส่งไฟล์ผ่านหลายช่องทางเพื่อลดโอกาสที่ผู้โจมตีจะดักรับได้อย่างมาก
splitใช้สำหรับระบุจำนวนชิ้นส่วนที่จะสร้างเมื่อแบ่งไฟล์ และจำนวนชิ้นส่วนที่ต้องใช้เพื่อกู้คืนไฟล์ต้นฉบับ โดยตัวอย่างเป็นการตั้งค่าให้กู้คืนได้ด้วยชิ้นส่วนใดก็ได้ 3 ชิ้นจากทั้งหมด 5 ชิ้นbindเป็นคำสั่งสำหรับรวมไฟล์ต้นฉบับกลับคืนจากไดเรกทอรีที่มีชิ้นส่วน horcrux และสามารถส่งไดเรกทอรีเป็นอาร์กิวเมนต์ได้เช่นกัน- กลไกภายในใช้ Shamir Secret Sharing Scheme เพื่อแบ่งคีย์เข้ารหัสออกเป็นหลายส่วน และจะสร้างคีย์เดิมกลับขึ้นมาได้เมื่อมีจำนวนชิ้นส่วนถึง ค่าขีดขั้นต่ำ (threshold) ที่กำหนด
- การสร้างคีย์ใช้ฟังก์ชัน
Readของcrypto/randในไลบรารีมาตรฐานของ Go ส่วนการทำ Shamir ใช้งานโค้ดที่ดัดแปลงมาจาก vault repo ของ Hashicorp - ติดตั้งได้ผ่าน Homebrew ด้วย
brew install jesseduffield/horcrux/horcrux, ผ่าน scoop ด้วยscoop bucket add extras; scoop install horcruxหรือผ่าน binary release - ทางเลือกอย่าง
ssssถูกระบุว่าใช้งานได้กับคีย์ แต่ไม่รองรับตัวไฟล์โดยตรง ส่วนhorcruxตัวอื่นและHaystackแตกต่างกันตรงที่ไม่รองรับ threshold ของ horcrux
1 ความคิดเห็น
ความคิดเห็นบน Hacker News
สิ่งที่ควรระวังคือเครื่องมือนี้ใช้ โหมด AES OFB สำหรับเข้ารหัสและถอดรหัสไฟล์ และไม่มีการรับประกันความถูกต้องครบถ้วนของ ciphertext กล่าวคือไม่มี MAC
[0]: https://en.wikipedia.org/wiki/Block_cipher_mode_of_operation...
มีโปรเจกต์เจ๋ง ๆ ในกลุ่มเครื่องมือสำรองข้อมูลแบบใช้กระดาษ ที่ใช้ Shamir secret sharing เพื่อให้แจกสำเนากระดาษหลายใบให้เพื่อน ๆ แล้วภายหลังอ่านด้วยวิธีเชิงแสงเพื่อกู้คืนไฟล์ได้
https://github.com/cyphar/paperback
ตอนนี้ฟังก์ชันทำงานได้ครบแล้ว แต่ยังต้องคัดลอกและวางเนื้อหา QR code ผ่าน command line และยังต้องทำให้รูปแบบบนดิสก์—หรือควรพูดว่าบนกระดาษ—นิ่งด้วย
https://github.com/paritytech/banana_split
เมื่อไม่นานมานี้ Levchin มีบทความเกี่ยวกับ Shamir secret sharing และความสับสนที่มันก่อขึ้นที่ PayPal: https://max.levch.in/post/724289457144070144/shamir-secret-s...
นี่เป็นหนึ่งในอัลกอริทึมที่ผมชอบที่สุด แต่พูดตามตรง ช่วงนี้ผมเริ่มสงสัยแล้วว่าผมแค่หลงใหลมันในเชิงวิชาการ หรือกรณีใช้งานจริงของมันจำกัดกว่าที่คิดกันแน่
มันเรียบง่ายพอที่จะเข้าใจได้แม้แทบไม่มีพื้นฐานด้านคริปโตกราฟีหรือคณิตศาสตร์ขั้นสูง จริง ๆ แล้วรู้พีชคณิตนิดหน่อยก็พอแล้ว ความเป็นไปได้ของมันเองก็น่าทึ่ง และอย่างน้อยในตอนแรก กรณีใช้งานที่เป็นรูปธรรมก็ดูชัดเจน แถมยังลองลงมือ implement เองได้ด้วย แน่นอนว่ายังมีหลุมพรางอยู่
เพราะแบบนั้นผมเลยคิดว่ามันปรากฏบ่อยเกินไป ทั้งในกระดานสนทนาและในโซลูชันระดับอุตสาหกรรม
ไม่รู้ว่าคุณกำลังโยงความสัมพันธ์เชิงเหตุและผลระหว่างสองเรื่องนี้หรือเปล่า แต่ปัญหาไม่ได้อยู่ที่ตัวอัลกอริทึม แต่อยู่ที่ อินเทอร์เฟซ สำหรับเข้าถึงอัลกอริทึมนั้น
ตาม FAQ เครื่องมือนี้แบ่งคีย์เข้ารหัสด้วย Shamir secret sharing แต่จริง ๆ แล้วถ้าใช้ Reed-Solomon ก็สามารถบรรลุเป้าหมายเดียวกันได้โดยไม่ต้องมีคีย์เข้ารหัส
ก่อนอื่นให้ประมวลผลข้อมูลอินพุตด้วย all-or-nothing transform (AONT) แล้วค่อยแบ่งเป็นชิ้นส่วน Reed-Solomon จำเป็นต้องใช้ AONT เพราะ Reed-Solomon อ่อนไหวต่อ distinguishing attack และมีโอกาสสูงที่จะรั่วข้อมูลของอินพุต
[1] <https://en.wikipedia.org/wiki/Reed%E2%80%93Solomon_error_cor...>
[2] <https://en.wikipedia.org/wiki/All-or-nothing_transform>
[3] <https://en.wikipedia.org/wiki/Distinguishing_attack>
ถ้าพูดให้เคร่งครัด ใน Shamir เองขั้นตอนการเข้ารหัสก็ไม่จำเป็นเช่นกัน เพียงแต่การเข้ารหัสตัวความลับเอง แล้วใช้ SSS แค่กับคีย์ มีข้อดีอยู่ ไม่รู้ว่า Horcrux ทำงานแบบนั้นไหม แต่เครื่องมือคล้าย ๆ กันของผมอย่าง Paperback ทำแบบนั้น
[1]: https://github.com/cyphar/paperback
บทความวิจัย: <https://www.usenix.org/legacy/event/fast11/tech/full_papers/...>
วิธี “แบ่งไฟล์ที่เข้ารหัสด้วยรหัสผ่านออกเป็นชิ้น ๆ เพื่อให้ประกอบกลับได้แม้บางชิ้นจะหายไป” นั้นพอนึกออกได้หลายแบบ แต่จุดที่น่าสนใจคือสามารถทำแบบนั้นได้ โดยไม่ต้องใช้รหัสผ่าน
ในฐานะคนที่ชอบหัวข้อความปลอดภัยหรืออัลกอริทึม นี่เป็นของที่น่าสนใจทีเดียว ผมน่าจะไปขุดซอร์สโค้ดและอ่านเทคนิคที่เกี่ยวข้อง เพราะอยากรู้ว่าเขาทำอย่างไร แต่อย่างไรก็ดี ยังไม่ค่อยแน่ใจว่าของแบบนี้มีประโยชน์ตรงไหน กำลังคิดอยู่ว่ามันมี threat model ที่มีความหมายในฐานะ “ชั้นเปลือกหัวหอม” อีกชั้นสำหรับปกป้องข้อมูลอ่อนไหวหรือไม่ หรือมีจุดที่เหนือกว่า use case ที่แก้ได้ดีกว่าด้วยวิธีอื่นอยู่แล้วหรือเปล่า
ผู้เขียนเองก็เปรียบเทียบแบบขำ ๆ ระหว่างปัญหาการจำรหัสผ่านไดอารี่เก่ากับการจำที่ซ่อนให้เพียงพอ ส่วนตัวคิดว่าอย่างหลังน่าจะเป็นปัญหาใหญ่กว่ามาก คงต้องลดจำนวนชิ้นส่วนและเพิ่มจำนวนที่ซ่อน แต่ถ้าทำแบบนั้น ความปลอดภัยที่ได้ก็จะลดลง[0]
นึกถึง multisig อยู่เหมือนกัน แต่ที่ผมเคยเจอมีแค่ประมาณว่า “ต้องเสียบ USB key และรันโปรแกรมร่วมกับเพื่อนร่วมงานอีกสองคนเพื่อปล่อยอัปเดตหนึ่งตัว” ทุกคนต้องให้ key ของตัวเอง และอยู่ในสภาพว่า “ถ้าผมลาป่วย อัปเดตก็ออกไม่ได้” ไม่รู้ว่านั่นเป็นข้อจำกัดของเครื่องมือ หรือเพราะตอนนั้นยังเป็น alpha เลยตั้งค่าไว้แบบนั้น
ถึงอย่างนั้นก็น่าสนใจมาก
[0] แต่ “ใต้ฟูก” ก็น่าจะมีความปลอดภัยระดับใกล้เคียงกับการตั้งรหัสผ่านเป็น “password”
กลไกความปลอดภัยจริง ๆ คือการควบคุมการเข้าถึงทางกายภาพแบบเดิม ขโมยต้องบุกเข้าไปสามแห่งถึงจะได้ข้อมูล
จะเข้ารหัสข้อมูลแล้วแบ่งรหัสผ่านออกเป็นสามชิ้นเก็บไว้คนละที่ก็ได้ แต่แบบนั้นต้องเก็บทั้งข้อมูลและรหัสผ่าน
เป็นสิ่งที่ดูเกี่ยวข้องกันจากชื่อ น่าจะมีมากกว่าหนึ่งโปรเจกต์ด้วยซ้ำ ยังมีอะไรอีกบ้างนะ?
Horcrux: Split your file into encrypted fragments - https://news.ycombinator.com/item?id=29395575 - พฤศจิกายน 2021, 11 ความเห็น
Show HN: Horcrux, a Playground for Shamir Secret Sharing - https://news.ycombinator.com/item?id=26256726 - กุมภาพันธ์ 2021, 40 ความเห็น
Horcrux Encrypted Messaging - https://news.ycombinator.com/item?id=24322069 - สิงหาคม 2020, 93 ความเห็น
I made an app that lets you split a file into horcruxes - https://news.ycombinator.com/item?id=24026445 - สิงหาคม 2020, 80 ความเห็น
You can now make horcruxes out of your confidential files - https://news.ycombinator.com/item?id=21933983 - มกราคม 2020, 17 ความเห็น
นึกถึง parity file ของ Usenet เลย เมื่อก่อนจะแบ่ง archive ขนาดใหญ่ออกเป็นไฟล์เล็กหลายไฟล์กับ parity file จำนวนหนึ่งแล้วอัปโหลด เช่น แม้มีแค่ n-3 ไฟล์จาก n ไฟล์ ก็ยังสร้าง archive ต้นฉบับกลับมาใหม่ได้
https://en.wikipedia.org/wiki/Parchive
เพิ่งรู้ไม่นานมานี้ว่า Clevis ก็รองรับ Shamir secret sharing ด้วย จริง ๆ แล้วนี่เป็นวิธีเดียวที่จะตั้งค่า pin หลายตัวที่เป็นชนิดและสิทธิ์เดียวกันได้ พูดได้ว่าเป็น RAID0 ของ SSS ประมาณนั้น
https://github.com/latchset/clevis#pin-shamir-secret-sharing
คิดว่าอันนี้ดูเนี้ยบดีเลยเข้าไปดู repository แล้วพบว่าคนทำคือคนเดียวกับที่ทำ lazygit/lazydocker ดีใจที่เห็นเขาผลิตงานออกมาเยอะ
ใน FAQ มีคำถามว่า “นี่ไม่ต่างจาก Horcrux ในจักรวาล Harry Potter เหรอ?” และตอบว่า “ค่อนข้างคล้ายกันนะ ไม่ควรให้ Horcrux อันเดียวชุบชีวิตไฟล์ต้นฉบับได้ แต่ทำให้สองอันทำได้ก็ได้ ต่างกันแค่อันเดียวเท่านั้น รุกฆาต แฟน ๆ Harry Potter”
แต่แก่นของ Horcrux คือการวาง backup ไว้หลายที่ เครื่องมือนี้ที่เอา backup ไป backup ไว้หลายที่เป็นตัวอย่างที่ใช้ชื่อได้เหมาะกว่ามาก: https://github.com/chrispoole643/horcrux. รุกฆาต, jesseduffield ;)
partial backup จึงเข้ากับจิตวิญญาณของไอเดียนั้นมากกว่า
เพิ่มเติมคือ ผมอ่านแนวคิดนั้นว่าเป็นการโจมตีความสำส่อน เหมือน “Whore crux” ในทางกลับกัน Lord of the Rings ก็อาจมองได้ว่าเป็นการโจมตีการแต่งงาน เพราะเมื่อสวมแหวนแล้วจะล่องหน และค่อย ๆ เลือนหายกลายเป็นสิ่งว่างเปล่าเหมือน “เนยที่ถูกปาดบาง ๆ บนขนมปังมากเกินไป”