it-swarm-vi.com

GUID có an toàn cho mã thông báo một lần không?

Tôi thấy rất nhiều trang web sử dụng GUID để đặt lại mật khẩu, hủy đăng ký yêu cầu và các hình thức nhận dạng duy nhất khác.

Có lẽ chúng hấp dẫn bởi vì chúng dễ tạo ra, độc đáo, không tuần tự và có vẻ ngẫu nhiên.

Nhưng chúng có đủ an toàn cho những mục đích này không?

Đối với tôi, dường như đã đưa ra một GUID, dự đoán các GUID tiếp theo có thể khả thi vì (theo như tôi biết) chúng không có ý định bảo mật bằng mật mã ... hay chúng là?

Ghi chú:

  • Tôi không nói về các trang web sử dụng một đốm ngẫu nhiên của gobbledygook được mã hóa trong cơ sở64.
  • Tôi đang nói về các trang web như thế này dường như đang sử dụng một hướng dẫn thô:
    [.__.] http://example.com/forgotPassword/?id=b4684ce3-ca5b-477f-8f4d-e05884a83d3c
84
Michael Haren

Chúng có đủ an toàn cho các mục đích bạn mô tả không? Theo tôi, nói chung là có. Chúng có đủ an toàn trong các ứng dụng mà bảo mật là mối quan tâm đáng kể không? Không. Chúng được tạo bằng thuật toán không ngẫu nhiên, vì vậy chúng không theo cách mã hóa ngẫu nhiên hoặc an toàn.

Vì vậy, đối với chức năng xác minh hủy đăng ký hoặc đăng ký, tôi thực sự không thấy vấn đề bảo mật. Mặt khác, để xác định người dùng của một ứng dụng ngân hàng trực tuyến, (hoặc thực sự có thể là chức năng đặt lại mật khẩu của một trang web có danh tính có giá trị) GUID chắc chắn là không đủ.

Để biết thêm thông tin, bạn có thể muốn xem phần 6 (Cân nhắc bảo mật) của RFC 4122 cho GUID (hoặc Mã định danh duy nhất toàn cầu).

42
Xander

đặc tả UUID chi tiết một số "phiên bản" là các phương thức để tạo UUID. Hầu hết đều nhằm mục đích đảm bảo tính duy nhất (đó là điểm chính của UUID) bằng cách sử dụng, ví dụ: ngày hiện tại. Điều này là hiệu quả nhưng có nghĩa là trong khi UUID được tạo là unique, thì chúng cũng có thể dự đoán được, khiến chúng không đủ cho một số cách sử dụng bảo mật.

Tuy nhiên, phương thức tạo UUID "phiên bản 4" (trong phần 4.4) , tuy nhiên, được cho là sử dụng trình tạo số ngẫu nhiên mạnh về mật mã. 6 trong số 128 bit được cố định theo giá trị thông thường (để chỉ ra rằng đây là UUID phiên bản 4, cụ thể là), do đó, điều này để lại 122 bit từ RNG.

Nếu RNG cơ bản được bảo mật (ví dụ: /dev/urandom Trên hệ thống BSD của Linux/MacOS/* hoặc CryptGenRandom() trên Windows) sau đó được cung cấp nhiều UUID được tạo, kẻ tấn công không được dự đoán là người tiếp theo có xác suất thành công cao hơn 2-122, đủ nhỏ cho hầu hết các mục đích, bao gồm mã phóng cho tên lửa hạt nhân.

122 bit ngẫu nhiên đảm bảo tính duy nhất với xác suất cao. Nếu bạn tạo nhiều UUID phiên bản 4 và tích lũy chúng, bạn có thể gặp phải va chạm đầu tiên sau khoảng 261 UUID - đó là khoảng 2 tỷ tỷ; chỉ cần lưu trữ số UUID đó sẽ sử dụng hơn 30 triệu terabyte. Nếu bạn xem xét "chỉ" 1012 UUID như vậy (một nghìn tỷ, có thể lưu trữ trên 16 terabyte), sau đó rủi ro có hai UUID giống hệt nhau trong số này là khoảng 9,4 * 10-14, tức là có khả năng giảm khoảng 700 nghìn lần so với việc kiếm được hàng triệu đô la tại xổ số.

Do đó, UUID are thích hợp cho mục đích bảo mật if (và chỉ khi) chúng là UUID "phiên bản 4" được tạo bằng RNG an toàn.

59
Thomas Pornin

Chúng được bảo mật trên Windows 2000 hoặc mới hơn. Lỗ hổng và rủi ro của bạn phụ thuộc vào cách GUID được tạo. Windows 2000 hoặc mới hơn sử dụng phiên bản 4 của GUID được bảo mật bằng mật mã.

Để biết thêm thông tin, hãy xem liên kết MSDN này và đây câu hỏi tràn ngăn xếp . (Cảm ơn Jordan Rieger trong các bình luận)

5
goodguys_activate

Nếu bạn đang sử dụng ngôn ngữ phát triển chung, việc tạo một bộ tạo số ngẫu nhiên duy nhất bằng cách sử dụng chức năng mã hóa phù hợp thì không quá khó (chúng ta đang nói về 10 dòng mã có sẵn dưới dạng mẫu trong các ngôn ngữ phổ biến nhất chỉ đơn giản là sử dụng Google ) và do đó, bằng cách sử dụng một hướng dẫn mới đơn giản, về cơ bản, sự lười biếng theo quan điểm của nhà phát triển.

Trong kịch bản được mô tả, chúng "đủ an toàn", nếu Hướng dẫn được truyền trong chức năng quên mật khẩu có một số tính năng cơ bản:

1) Đây thực sự là một giá trị một lần bắn không có mối quan hệ với id người dùng, vì vậy, một khi mật khẩu đã được đặt lại, không thể sử dụng được nữa

2) Nó có một cửa sổ thời gian xác định tính hợp lệ của nó (bạn có thể đặt lại mật khẩu trong 30 phút tiếp theo hoặc đại loại như thế)

Nếu sử dụng cùng Hướng dẫn, bạn có thể đặt lại mật khẩu nhiều lần hoặc đoán hướng dẫn và đặt lại mật khẩu của người dùng không yêu cầu đặt lại mật khẩu hoặc, như Avid mô tả trong nhận xét, hãy thử truy cập để đặt lại mật khẩu bằng một số loại phát lại đính kèm sau đó là thiết kế ứng dụng bị lỗi và sử dụng hoặc không sử dụng Hướng dẫn không phải là vấn đề thực sự.

Vì vậy, nếu bạn không xử lý thông tin rất nhạy cảm thì có thể một hướng dẫn có thể hoạt động, nhưng tại sao lần đầu tiên bạn không tạo mọi thứ theo cách phù hợp và sử dụng api mật mã thích hợp để tạo chuỗi ngẫu nhiên an toàn?

Trân trọng Massimo

3
massimogentilini

Các "GUID" giả, là không được tạo bởi bất kỳ thuật toán tạo GUID, nhưng thay vào đó chỉ đơn giản là 128 bit (16 byte) được tạo bởi PRNG bảo mật bằng mật mã, và được biểu diễn đơn thuần bằng cách sử dụng mã hóa thông thường GUID hex-with-hyphens, hầu hết an toàn cho mã thông báo một lần.

Tuy nhiên, bạn gặp phải vấn đề sinh nhật, vì sự tồn tại của một vụ va chạm là khoảng 2 ^ -64 cho mã thông báo 128 bit.

Tốt hơn là sử dụng mã thông báo 256 bit hoặc 512 bit, trong đó sự tồn tại của một vụ va chạm là khoảng 2 ^ -128 hoặc 2 ^ -256.

0
yfeldblum