2009-02-23 29 views
19

Tôi muốn làm một số thử nghiệm với javascript và mã hóa và tôi đã tò mò như thế nào không thể đoán trước việc thực hiện các chức năng ngẫu nhiên là. Có ai thực hiện bất kỳ thử nghiệm khó khăn nào không?Khả năng thực thi ngẫu nhiên của javascript đáng tin cậy trong các trình duyệt khác nhau như thế nào?

Trình duyệt rõ ràng có khả năng tạo ra sự ngẫu nhiên mạnh mẽ (đối với ssl). Các câu hỏi là họ cung cấp cho javascript quyền truy cập vào cùng một sức mạnh.

+0

Xem thêm https://security.stackexchange.com/questions/84906/predicting-math -Mã số-số –

Trả lời

15

Nói chung, hàm ngẫu nhiên không mạnh về mặt mã hóa, vì bạn cần đảm bảo rằng bạn đang sử dụng trình tạo số giả ngẫu nhiên mã hóa.

chức năng ngẫu nhiên Generic thường không sử dụng phương pháp hệ mã hóa mạnh mẽ vì họ mất nhiều thời gian hơn so với kẻ ngu dốt, (ví dụ. Yarrow là phức tạp hơn Mersenne Twister) và yêu cầu quản lý chặt chẽ của hồ bơi entropy, mà không phải là một sự đảm bảo rằng Mozilla, cstdlib, v.v. muốn làm cho bạn.

Nếu bạn cần truy cập vào các trình tạo số ngẫu nhiên mã hóa mạnh, tôi sẽ xem xét việc truy cập vào triển khai SSL cơ bản (một trình duyệt nhất định có thể hoặc không cho phép truy cập).

7

Mỗi công cụ JavaScript tôi quen thuộc làm không sử dụng các RNG có mật mã mạnh.

Nếu bạn cần nguồn entropy tốt trong trình duyệt (và tốt nhất là không cần đến nó), tôi khuyên bạn nên chụp dữ liệu di chuyển chuột và chạy nó thông qua thuật toán băm mật mã mạnh. Các chương trình hiện tại như Entropy Gathering Daemon (được sử dụng với gpg) có thể được sử dụng làm tài liệu tham khảo về cách triển khai hệ thống như vậy.

+1

[SJCL] (http://bitwiseshiftleft.github.io/sjcl/doc/symbols/sjcl.random.html) và [Clipperz] (https://www.clipperz.com/security_privacy/crypto_algorithms/ #prng) Các thư viện JS thực hiện thu thập entropy. –

1

Một điểm dữ liệu thú vị mà tôi đã tìm thấy là mozilla có đối tượng mã hóa javascript chưa được triển khai đầy đủ.

1

Nói chung bạn không thể dựa vào việc tạo số ngẫu nhiên giả trong javascript để thậm chí bảo mật mã hóa từ xa. Bạn có thể xem xét việc thực hiện PNRG của riêng bạn bằng hệ thống thu thập entropy, hoặc có thể sử dụng một nguồn ngẫu nhiên bên ngoài như hotbits.

13

Trình duyệt gần đây hiển thị window.crypto.getRandomValues() mạnh mẽ về mặt mã hóa.

Ngoài ra còn có các thư viện JS triển khai các RNG mạnh nhưng không có getRandomValues() nó là một phần rất khó để thu thập entropy. Nó can be done from mouse & keyboard mặc dù nó có thể mất một thời gian dài.

Math.random() yếu trong hầu hết các trình duyệt trong năm 2008 - Amit Klein's paper đi vào chi tiết tuyệt vời - và thật đáng buồn là gần như yếu như hiện nay.

UPDATE: Có vẻ như thực tế tất cả các trình duyệt chuyển trong 2015-2016 để XorShift128+ - một biến thể nhanh trên LFSR điều chỉnh để tính thống kê tốt nhưng cũng rất yếu mã hóa: https://lwn.net/Articles/666407/, https://security.stackexchange.com/questions/84906/predicting-math-random-numbers. Chi tiết bên dưới đã lỗi thời.

  • Firefox đã sử dụng thuật toán rất yếu "riêng của chúng tôi LFSR"; họ đã thảo luận về việc chuyển sang một thuật toán mạnh mẽ hơn và nguồn entropy từ năm 2006 (bug 322529). CẬP NHẬT: năm 2015 họ chuyển sang XorShift128 +.

    Vào tháng 5 năm 2013, ít nhất họ đã chuyển hạt giống từ thời điểm hiện tại sang nguồn entropy tốt (bug 868860), cũng loại bỏ (?) Rò rỉ thẻ chéo.

  • Webkit sử dụng thuật toán nhanh yếu (GameRand) since 2009 nhưng hạt since 2010 (trong mỗi ngữ cảnh) từ RNG mạnh được khởi tạo từ nguồn HĐH mạnh.
    (Tôi đoán đây là những gì Safari sử dụng nhưng tôi có thể nhầm lẫn về các cảng WebKit khác nhau ...)

  • Chrome không sử dụng ngẫu nhiên của WebKit, không riêng của mình trong động cơ V8, a weak linear thing.
    Không có thỏa thuận cho dù Math.random() nên mạnh (bug 246054).

    Không chắc chắn hạt giống được gieo hạt như thế nào. V8 có móc SetEntropySource(), nhưng dường như nó chỉ là introduced for unit testing, không được Chrome gọi. Nếu không được gọi, random() được sử dụng để gieo hạt.

    Bang đã trở thành mỗi ngữ cảnh in 2011 nhưng điều đó không thực sự hữu ích khi gieo hạt yếu.

  • Opera đã khai báo số fixed in Jan 2009say here rằng Math.random() của họ mạnh về mặt mã hóa.

  • Không tìm thấy tài liệu về những gì IE hiện nay. Họ có PRNG tuyến tính yếu trong năm 2008 (xem giấy). Họ đã nói với Amit họ sẽ sửa chữa nó trong một gói dịch vụ, do đó có thể là một tư vấn ở đâu đó ...

+0

Không phải là vấn đề với loại điều này mà hầu như bất cứ điều gì có thể ghi đè lên bất cứ điều gì trong JS? – Phil

+0

Phụ thuộc vào mục tiêu của bạn. Tác giả trang web chỉ có thể phân phát mã JS được tin cậy (ví dụ: không tải jQuery từ CDN, tự phân phối nó, chỉ https của khóa học, v.v.). Nhưng khi người dùng không muốn tin tưởng vào máy chủ, [các ứng dụng trình duyệt là một hướng khá vô ích] (http://tonyarcieri.com/whats-wrong-with-webcrypto). –

Các vấn đề liên quan