3 điểm bởi GN⁺ 9 giờ trước | 1 bình luận | Chia sẻ qua WhatsApp
  • Chia sẻ bí mật Shamir chia một bí mật thành nhiều mảnh, chỉ có thể khôi phục khi tập hợp đủ từ ngưỡng trở lên, còn ít hơn thì không làm lộ bất kỳ thông tin nào
  • Hữu ích trong các trường hợp như khóa master của công ty, khôi phục tài khoản gia đình, sao lưu nhóm, khi khó giao toàn bộ bí mật cho một người và vẫn cần khôi phục ngay cả khi mất một số mảnh
  • Mô hình cốt lõi là ẩn bí mật dưới giá trị tại điểm 0 của một đa thức, rồi chia cho mỗi mảnh dưới dạng một điểm trên đường cong
  • Với ngưỡng k, dùng đa thức bậc k - 1; hai mảnh tương ứng với đường thẳng, ba mảnh là parabol, bốn mảnh là đường cong bậc ba
  • Legacy Kit của Ente dùng cách này như một lớp trong hệ thống để thẻ không trở thành khóa khôi phục vĩnh viễn, đồng thời cho phép hủy các thẻ đã phát hành

Cách chia bí mật bằng điểm và đa thức

  • Đây là phương pháp do Adi Shamir công bố năm 1979, và điểm cốt lõi không chỉ là “khó phá” mà là nếu thiếu số mảnh cần thiết thì hoàn toàn không lộ ra thông tin nào
  • Hai điểm khác nhau xác định chính xác một đường thẳng, nhưng nếu chỉ có một điểm thì có vô số đường thẳng đi qua điểm đó, và mỗi đường sẽ cắt trục dọc tại một vị trí khác nhau
  • Nếu bí mật là số 7, có thể giấu giá trị này tại vị trí đường thẳng cắt trục dọc
  • Độ dốc không phải là bí mật mà đóng vai trò ngẫu nhiên để che giấu bí mật
  • Nếu phát cho mỗi người một điểm trên đường thẳng, thì chỉ với một điểm của một người sẽ có vô số đường thẳng khả dĩ, tất cả đều tương thích với những bí mật khác nhau
  • Khi ghép hai điểm lại, đường thẳng được xác định cố định, và có thể khôi phục bí mật bằng cách đọc giá trị mà đường đó có tại 0
  • Cấu trúc này là mô hình chia sẻ bí mật 2-of-n; có thể tạo bao nhiêu điểm tùy ý, nhưng chỉ cần bất kỳ hai điểm nào cũng có thể khôi phục đường thẳng
  • Khi ngưỡng tăng lên, ta dùng các đường cong bậc cao hơn
    • Parabol cần ba điểm mới xác định được, nên nếu giấu bí mật tại vị trí parabol cắt trục dọc thì có thể khôi phục bằng bất kỳ ba mảnh nào, còn hai mảnh thì không thể
    • Nói chung, với ngưỡng k thì dùng đa thức bậc k - 1
    • 2 mảnh là đường thẳng, 3 mảnh là parabol, 4 mảnh là đường cong bậc ba
    • Trong triển khai thực tế, người ta không dùng giấy kẻ ô để vẽ đồ thị mà dùng số học trường hữu hạn, nhưng cấu trúc vẫn giống nhau: bí mật là giá trị tại 0, các hệ số ngẫu nhiên che giấu nó, và mỗi mảnh là một điểm trên đa thức
    • Điều quan trọng là khi không đủ mảnh, vấn đề không chỉ là khó tính ra bí mật, mà là mọi bí mật khả dĩ vẫn đều còn có thể xảy ra

Ente Legacy Kit và tài liệu tham khảo

  • Ente sử dụng ý tưởng này trong Legacy Kit
  • Mục tiêu cần đạt không chỉ là chia nhỏ bí mật, mà còn phải cho phép khôi phục trong khi các mảnh đã chia không trở thành khóa khôi phục vĩnh viễn
  • Legacy Kit sử dụng phương pháp Shamir như một lớp trong một luồng lớn hơn
  • Bản thân khóa khôi phục không nằm trên thẻ; thay vào đó, một bí mật riêng được tái tạo cục bộ rồi tham gia vào quá trình khôi phục do máy chủ làm trung gian
  • Nhờ cấu trúc này, các thẻ đã phát hành có thể bị hủy, và thẻ bị mất không trở thành gánh nặng vĩnh viễn
  • Tài liệu tham khảo

1 bình luận

 
Ý kiến trên Hacker News
  • Tôi đã viết luận văn thạc sĩ về chủ đề này. Tôi đã tạo một ứng dụng chia dữ liệu để lưu trên nhiều nhà cung cấp lưu trữ phổ biến như Dropbox, Google Drive, OneDrive, và dùng chia sẻ bí mật để hỗ trợ mã hóa
    Ưu điểm là nhà cung cấp không còn có thể đọc dữ liệu, chỉ cần 2 nơi còn hoạt động nên có độ dư thừa bổ sung, và khác với các ứng dụng lưu trữ bảo mật khác nơi quên mật khẩu chủ là hết cách, có thể dùng nguyên quy trình khôi phục tài khoản sẵn có

    • Ý tưởng nghe rất hay, không biết sau đó có phát triển thành sản phẩm hay ứng dụng mã nguồn mở nào không
  • Tôi tự hỏi liệu có cách nào gộp nhiều cặp khóa/giá trị thành một bản mã duy nhất hay không. Không chỉ đơn giản là nối chuỗi hoặc làm kích thước kết quả bùng nổ, mà là để mọi người đưa thông tin vào hệ này cùng lưu một khối đã mã hóa giống nhau nhưng với khóa riêng của mình lại giải mã ra các giá trị khác nhau
    Như vậy mọi người có thể đóng vai trò sao lưu cho nhau mà vẫn có khả năng phủ nhận hợp lý về việc chính xác đang lưu thứ gì

  • Trong luận văn thạc sĩ, tôi đã áp dụng chia sẻ bí mật Shamir vào mạng mesh. Ý tưởng là ngay cả khi một nút trong mesh bị kẻ tấn công chiếm được và bí mật của nút đó bị thu hồi thì vẫn không thể phá được toàn bộ mã hóa

  • Nhóm chúng tôi dùng kỹ thuật này để phân phối mật khẩu của kho lưu trữ bí mật phụ theo cách “an toàn một cách dân chủ”. Kho phụ đó chứa cách truy cập vào kho bí mật chính
    https://packages.debian.org/trixie/ssss là một triển khai ổn và khá trực quan

  • Shamir đã từng cứu tôi một bàn thua trông thấy. Tôi phải khôi phục gấp một bản sao lưu gần như đã bị quên lãng, và nhờ đó có thể tái tạo mật khẩu ngẫu nhiên đã dùng khi đó
    May mà trước đây tôi đã chia các mảnh phân tán cho người thân “để phòng khi cần”

  • Đoạn “điểm hữu ích không phải là nếu có quá ít mảnh thì khó tính ra bí mật. Mà là nếu có quá ít mảnh thì hoàn toàn không có thông tin gì về bí mật. Chỉ cần thiếu một mảnh thì mọi bí mật khả dĩ vẫn đều có thể xảy ra” làm tôi nhớ tới việc phân tích số bằng trường bậc hai hay các biến thể của nó
    Bạn tìm ra hệ các đồng dư mod n và cuối cùng tính được các thừa số nguyên tố, nhưng trước khi gom đủ thì điều đó là bất khả thi. Mỗi đồng dư chắc hẳn vẫn mang một ít thông tin nào đó, nên tôi luôn thắc mắc rốt cuộc ta đang giảm bậc tự do trong không gian nào
    Ở đây cũng vậy, mỗi mảnh đều giới hạn không gian các đa thức, nhưng chưa giới hạn đủ để cho biết điểm nơi khóa cắt trục

  • Đây thực sự là một kỹ thuật rất hay, đủ đơn giản để có thể dạy ở trường trung học như một ví dụ thú vị về những việc nhà khoa học máy tính có thể làm với đa thức

    • Tôi là giáo viên toán trung học và thực sự dạy học sinh theo cách này
      Trong bài học khôi phục phương trình hàm bậc nhất, tôi giới thiệu Shamir, cho học sinh chọn PIN bí mật làm hệ số góc, rồi tạo hai điểm để đưa cho hai học sinh khác. Hai em đó phải ghép cặp để tìm lại PIN, và học sinh lúc nào cũng rất hào hứng
  • Bruce Schneier đã giải thích nội dung này trong cuốn sách kinh điển Applied Cryptography, và HashiCorp Vault cũng từng có một triển khai bằng Go. Về mặt thực tế, tôi luôn thắc mắc các mảnh phân tán nên có độ dài bao nhiêu bit
    Câu trả lời tôi từng nghe trên nhóm tin là “nhiều hơn độ dài khóa thực tế 1 bit”. Giờ tôi lại tò mò mối đe dọa từ máy tính lượng tử sẽ ảnh hưởng thế nào đến 1) việc chọn kích thước mảnh và 2) các ưu nhược điểm của chia sẻ bí mật nói chung

    • Biến thể Shamir cơ bản là an toàn theo lý thuyết thông tin, và hoàn toàn không bị ảnh hưởng bởi máy tính lượng tử
      Nếu bạn tạo các mảnh Shamir ngưỡng “10 trong số” cho một bí mật 1 byte và đưa ra 9 mảnh 1 byte, thì không có máy tính nào trong vũ trụ có thể tìm ra bí mật đó. Trong triển khai thực tế, bạn cần thêm mã xác thực thông điệp hoặc checksum để kiểm tra tính toàn vẹn nên sẽ lớn hơn vài byte
    • Thông thường người ta làm chia sẻ bí mật trong trường hữu hạn vì máy tính không thích sai số. Kích thước một mảnh là điểm (x, y), trong đó x có thể nhỏ, thường cỡ log n khi có n người tham gia, còn y là một điểm ngẫu nhiên trong trường
      Chia sẻ bí mật Shamir an toàn theo lý thuyết thông tin, nên với bí mật k-out-of-n, nếu không có đủ k điểm thì ngay cả vét cạn cũng thấy mọi bí mật đều hợp lý như nhau. Vì thế số bit của trường có thể chọn tùy ý, nhưng dĩ nhiên phải lớn hơn số bit của bí mật. Bạn không thể giấu 100 bit trong một trường hữu hạn chỉ có 5 phần tử
      Thông thường bạn còn phải ngăn kẻ tấn công vét cạn chính bản thân bí mật. Dù phương pháp an toàn theo lý thuyết thông tin, bản thân bí mật thường không như vậy. Ví dụ seed của ví là như thế, nên người ta thêm tính ngẫu nhiên vào bí mật và chọn kích thước trường đủ lớn để chặn kiểu tấn công này
      Tùy mô hình đe dọa, trường 80 bit hoặc 128 bit thường đã đủ an toàn, và kích thước mảnh cũng chỉ nhỉnh hơn 80 bit hoặc 128 bit một chút. Với máy tính lượng tử, vì phương pháp này an toàn theo lý thuyết thông tin nên không thể tồn tại kiểu tấn công đó
    • Theo tôi biết thì HashiCorp vẫn còn giữ triển khai này cho quy trình seal/unseal của Vault. Tất nhiên là nếu chưa có gì thay đổi
    • Phương pháp Shamir dựa trên định lý cơ bản của đại số. Muốn xác định duy nhất một đa thức bậc n thì cần n+1 điểm
      Vì vậy để tạo cấu hình n-of-k, bạn tạo một đa thức p(x) bậc n-1 rồi lấy k điểm bất kỳ từ đa thức đó. Mảnh thứ i đơn giản là (xi, yi), nên số bit của nó do trường dùng để xây đa thức quyết định
      Trường đó phải đủ rộng để chứa toàn bộ bí mật, và vì phải lưu cả hai giá trị (x, y), kích thước mảnh tối thiểu là gấp đôi kích thước bí mật. Tuy vậy vẫn cần kiểm tra tính toàn vẹn để biết mảnh có bị hỏng hay không
      Tôi hiểu rằng điện toán lượng tử không làm thay đổi gì ở đây. Chỉ cần thiếu một điểm thì điểm cuối cùng vẫn có thể thay bí mật bằng bất cứ giá trị nào, và không có cách nào để phân biệt
    • Toàn bộ bí mật không nhất thiết phải là một phần tử duy nhất của trường nền. Nó cũng có thể là một bộ n phần tử của những phần tử trường nhỏ hơn
      Nếu bạn không dự kiến số lượng mảnh nhiều đến mức vô lý, thì GF(2^8) là một lựa chọn khá tự nhiên, và cũng không cần xử lý số nguyên lớn
  • Triển khai của Ente ở đây: (https://2of3.ente.com/)

    • Đây là thứ tôi thích nhất trong số những gì đã thấy cho tới giờ, và rất thân thiện với người dùng. Dù vậy tôi vẫn muốn nó có thể tùy chỉnh hơn một chút
      Lý tưởng nhất là có thể tạo các cấu hình như 3 of 4: A B C D hoặc 2 of 3: E F G1 of 1: H
      Cũng sẽ hay nếu có cách gắn tên lên các thẻ để làm rõ chính xác cần gì khi khôi phục. Tất nhiên sự đơn giản trong thiết kế hiện tại cũng có cái hay riêng
    • Cũng có một triển khai được đóng gói trong hầu hết các bản phân phối Linux: http://point-at-infinity.org/ssss
    • Có nhiều phiên bản chạy trên trình duyệt, có thể dùng trực tuyến hoặc tải xuống để dùng ngoại tuyến
      https://bs.parity.io/ -- http://passguardian.com/ -- https://iancoleman.io/shamir/
  • Vài năm trước tôi đã làm một công cụ nhỏ chạy Shamir secret sharing ngay trong trình duyệt. Tải trang xuống là có thể dùng hoàn toàn ngoại tuyến
    https://simon-frey.com/s4/

    • Vài năm trước tôi đã tải trang đó xuống và lưu vào vài ổ USB, đồng thời để cả cơ sở dữ liệu KeePass và các mảnh mật khẩu vào đó
      Tôi đưa chúng cho vài người thân trong gia đình và dặn rằng nếu tôi chết thì hãy chuyển cho vợ tôi