Tôi đang tạo một ứng dụng lưu trữ tài liệu và cung cấp cho từng người một UID dựa trên thông báo SHA1 về một số thứ bao gồm dấu thời gian. Thông báo có nhiều ký tự và tôi muốn cho phép người dùng xác định tài liệu bằng cách sử dụng ký tự x đầu tiên của thông báo đầy đủ. Giá trị tốt cho x nếu số lượng tài liệu là khoảng 10K - 100K?Có bao nhiêu bạn có thể cắt bớt mã băm SHA1 và chắc chắn có một ID duy nhất?
Trả lời
Điều chỉnh các công thức trên wikipedia for the Birthday problem, bạn có thể ước tính xác suất va chạm là e^(-n^2/(2^(b+1)))
, trong đó n
là số tài liệu và b
là số bit. Graphing this formula with n=100,000, có vẻ như bạn sẽ muốn b> 45 ít nhất. Tôi muốn có xu hướng đi với 64 để làm cho nó một số đẹp và tròn. Điều đó nói rằng, có một kế hoạch để đối phó với va chạm nếu chúng xảy ra (có thể thay đổi dấu thời gian một chút, hoặc thêm một nonce?)
Đối với vấn đề đó, nếu sha1 dựa trên nhiều hơn nội dung của tài liệu, tại sao không chỉ đơn giản là làm cho nó một ID ngẫu nhiên? Trong trường hợp này, các va chạm ít có vấn đề hơn, vì bạn luôn có thể tạo ra một số ngẫu nhiên mới và thử lại (xác suất va chạm với một lần thử duy nhất là như nhau, tuy nhiên).
Có thực sự không phải là một giá trị cho việc này; một phần của những gì làm cho SHA là một thuật toán băm có mục đích chung tốt là dữ liệu tương tự không nhất thiết tạo ra các giá trị băm tương tự. Đặt cược tốt nhất của bạn (không biết bất kỳ điều gì khác về hệ thống của bạn) sẽ chỉ là tìm kiếm danh sách tài liệu có băm bắt đầu bằng giá trị do người dùng cung cấp, sau đó trình bày chúng với danh sách tài liệu để chọn hoặc chuyển trực tiếp đến tài liệu nếu chỉ có một.
là những gì git làm với vòng quay? – dan
@dan Nó là, và nó thường là một cách tiếp cận khá tốt. –
Vâng, đây là một thể quá đơn giản của một câu trả lời ..
Nếu với sha1 đầy đủ, bạn nhận được khoảng 1 trong 2^160 cơ hội va chạm, sau đó bằng cách cắt xén một ký tự bạn tăng nguy cơ va chạm bằng 16 (tất cả các giá trị có thể có của nhân vật cắt ngắn) ... là 2^4 .. Vì vậy, nếu bạn cắt x ký tự, bạn sẽ nhận được 1 trong 2^(160 - 4 * x) cơ hội va chạm .. phải không?
Đối với một tài liệu duy nhất điều này là đúng, nhưng xác suất của bất kỳ va chạm xảy ra cho bất kỳ cặp tài liệu tăng nhanh hơn nhiều – bdonlan
Biham/Chen cung cấp các ví dụ về gần va chạm; và Knudsen chứng minh sự khác biệt bị cắt ngắn. Cả hai đều là vấn đề cho băm bị cắt ngắn; không phải là trường hợp nghịch lý sinh nhật. – jww
Đây là generalization trong số the birthday problem. Trong trường hợp của bạn n là số tài liệu và thay vì hằng số 365, bạn sẽ có số khả năng mà phần cắt cung cấp cho bạn (vì vậy đối với số bit k là 2 k).
Tất nhiên, tính toán chính xác không nằm trong câu hỏi, nhưng bạn có thể sử dụng approximation.
Biham/Chen cung cấp các ví dụ về các va chạm gần; và Knudsen chứng minh sự khác biệt bị cắt ngắn.Cả hai đều là vấn đề cho băm bị cắt ngắn; không phải là trường hợp nghịch lý sinh nhật. – jww
Hãy cẩn thận cắt ngắn vì không có bằng chứng giảm nào cho thấy băm nhỏ hơn được bảo mật. Xem số http://csrc.nist.gov/groups/ST/hash/documents/Kelsey_Truncation.pdf của Kelsey. Kelsey đưa ra các đối số heuristic cho biết như vậy ("Hash Outputs" và "Near Collisions"). Biham/Chen cung cấp các ví dụ về các va chạm gần; và Knudsen chứng minh sự khác biệt bị cắt ngắn.
Cuối cùng, bạn có thể muốn cung cấp dữ liệu của bạn thành một HMAC với kích thước cắt ngắn (kích thước được tiêu hóa bởi HMAC, quá) và sau đó sử dụng HMAC cắt ngắn.
Xin chào JWW, về NIST-PDF, cách bạn diễn giải nó? Công thức của @ bdonlan, 'e^(- n^2/(2^(b + 1)))', là một xấp xỉ tốt để ước tính cắt ngắn hay không? Nếu không, công thức hoặc thuật toán để kiểm tra * số bit tối thiểu * (_bmin_) cho việc cắt ngắn SHA1 là gì? –
- 1. Bạn có chắc chắn muốn xóa không?
- 2. OnClientClick = "return confirm ('Bạn có chắc chắn muốn xóa');"
- 3. Bạn có chắc chắn muốn điều hướng không?
- 4. Chương trình không chắc chắn nhất mà bạn phải duy trì là gì?
- 5. Có một "bạn có chắc chắn" để thực hiện thủ tục lưu trữ không? :)
- 6. Có bao nhiêu ViewStub quá nhiều cho một tệp XML bố cục duy nhất?
- 7. Có bao nhiêu băm SHA256 có thể tính toán máy tính hiện đại?
- 8. Có bao nhiêu LINQ?
- 9. Thêm "Bạn có chắc chắn không?" để nút excel của tôi, làm thế nào tôi có thể?
- 10. Tạo một id duy nhất
- 11. có bao nhiêu múi giờ?
- 12. Bỏ qua Dấu nhắc Rsync "Bạn có chắc chắn muốn tiếp tục kết nối"
- 13. Xác định có bao nhiêu trường đối tượng Javascript có
- 14. Bạn có thể có bao nhiêu vai trò cho mỗi trường hợp Azure
- 15. Số hàng tối đa mà một bảng SQL Server duy nhất có thể lưu trữ là bao nhiêu?
- 16. Powershell, có bao nhiêu thay thế đã làm cho bạn?
- 17. Bạn có thể nhận mã định danh duy nhất cho đối tượng MATLAB không?
- 18. Có bao nhiêu mục mà ListView có thể lưu trữ?
- 19. Có thể có bao nhiêu cạnh trong DAG?
- 20. Có thể có bao nhiêu kết nối ổ cắm?
- 21. Có bao nhiêu người đọc đồng thời một pthread_rwlock có?
- 22. Không thể bao gồm gói lê chắc chắn tồn tại (và được cài đặt)
- 23. Có bao nhiêu phương pháp có thể một lớp C# có
- 24. Android tôi có thể đi bao nhiêu chủ đề?
- 25. Tạo ID duy nhất
- 26. Có bao nhiêu phương thức mặc định của một lớp?
- 27. Bạn có thể lưu trữ bao nhiêu dữ liệu trong một đối tượng phiên người dùng?
- 28. Mã scala có thể duy trì được không?
- 29. Làm thế nào tôi có thể chắc chắn rằng N luồng chạy ở cùng tốc độ?
- 30. maven-chắc chắn thành-lập báo cáo cắm không tạo chắc chắn hơn-report.html
Nhỏ nit - Không phải là formuala e^(- n^2/(2^(b + 1)))? Nó thay đổi trả lời một chút để b> 40. – Fakrudeen
@ Fakrudeen, thực sự - tôi đã thực hiện một lỗi khi sao chép nó vào câu trả lời. Các đồ thị là chính xác mặc dù ..... mặc dù tôi chỉ bây giờ nhận ra stackoverflow đã không thực hiện một liên kết cho nó: | – bdonlan
Tôi đã cập nhật câu trả lời để có công thức chính xác như đã thỏa thuận trong các nhận xét. –