Tiền điện tử
Các mối quan tâm với mật mã trong javascript phía máy khách (trình duyệt) được trình bày chi tiết bên dưới. Tất cả trừ một trong những mối quan tâm này không áp dụng cho API WebCrypto , hiện được hỗ trợ khá tốt .
Đối với một ứng dụng ngoại tuyến, bạn vẫn phải thiết kế và triển khai kho khóa an toàn.
Ngoài ra: Nếu bạn đang sử dụng Node.js, hãy sử dụng API mã hóa dựng sẵn .
Mật mã gốc Javascript (tiền WebCrypto)
Tôi cho rằng mối quan tâm chính là ai đó có quyền truy cập vật lý vào máy tính đang đọc localStorage
trang web của bạn và bạn muốn mật mã để giúp ngăn chặn truy cập đó.
Nếu ai đó có quyền truy cập vật lý, bạn cũng sẵn sàng tấn công người khác và tệ hơn là đọc. Chúng bao gồm (nhưng không giới hạn): keylogger, sửa đổi tập lệnh ngoại tuyến, tiêm tập lệnh cục bộ, nhiễm độc bộ đệm của trình duyệt và chuyển hướng DNS. Những cuộc tấn công đó chỉ hoạt động nếu người dùng sử dụng máy sau khi nó bị xâm nhập. Tuy nhiên, truy cập vật lý trong một kịch bản như vậy có nghĩa là bạn có vấn đề lớn hơn.
Vì vậy, hãy nhớ rằng kịch bản giới hạn trong đó tiền điện tử cục bộ có giá trị sẽ là nếu máy bị đánh cắp.
Có những thư viện thực hiện chức năng mong muốn, ví dụ Thư viện tiền điện tử Javascript Javascript . Tuy nhiên, có những điểm yếu cố hữu (như được đề cập trong liên kết từ câu trả lời của @ ircmaxell):
- Thiếu entropy / tạo số ngẫu nhiên;
- Thiếu kho lưu trữ khóa an toàn tức là khóa riêng phải được bảo vệ bằng mật khẩu nếu được lưu trữ cục bộ hoặc được lưu trữ trên máy chủ (có chức năng truy cập ngoại tuyến);
- Thiếu xóa an toàn;
- Thiếu đặc điểm thời gian.
Mỗi điểm yếu này tương ứng với một loại thỏa hiệp về mật mã. Nói cách khác, trong khi bạn có thể có "tiền điện tử" theo tên, nó sẽ nằm dưới mức nghiêm ngặt mà người ta khao khát trong thực tế.
Tất cả những gì đang được nói, việc đánh giá chuyên gia tính toán không tầm thường như "tiền điện tử Javascript yếu, không sử dụng nó". Đây không phải là một sự chứng thực, hoàn toàn là một lời cảnh báo và nó đòi hỏi bạn phải hoàn toàn hiểu được sự phơi bày của các điểm yếu trên, tần suất và chi phí của các vectơ mà bạn gặp phải và khả năng giảm thiểu hoặc bảo hiểm trong trường hợp thất bại: Javascript crypto, trong mặc dù điểm yếu của nó, có thể làm giảm sự tiếp xúc của bạn nhưng chỉ chống lại kẻ trộm với năng lực kỹ thuật hạn chế. Tuy nhiên, bạn nên cho rằng tiền điện tử Javascript không có giá trị chống lại kẻ tấn công xác định và có khả năng đang nhắm mục tiêu thông tin đó. Một số người sẽ coi đó là sai lầm khi gọi dữ liệu là "được mã hóa" khi có rất nhiều điểm yếu được biết là vốn có khi thực hiện. Nói cách khác, bạn có thể giảm nhẹ mức độ tiếp xúc kỹ thuật của mình nhưng bạn tăng mức độ tiếp xúc tài chính từ việc tiết lộ thông tin. Mỗi tình huống là khác nhau, tất nhiên - và phân tích giảm tiếp xúc kỹ thuật đối với tiếp xúc tài chính là không tầm thường. Đây là một tương tự minh họa:Một số ngân hàng yêu cầu mật khẩu yếu , bất chấp rủi ro vốn có, bởi vì mức độ mất mát từ mật khẩu yếu của họ thấp hơn chi phí của người dùng cuối khi hỗ trợ mật khẩu mạnh.
Nếu bạn đọc đoạn cuối và nghĩ rằng "Một số người trên Internet tên là Brian nói rằng tôi có thể sử dụng tiền điện tử Javascript", đừng sử dụng tiền điện tử Javascript.
Đối với trường hợp sử dụng được mô tả trong câu hỏi, dường như sẽ có ý nghĩa hơn đối với người dùng để mã hóa phân vùng cục bộ hoặc thư mục chính của họ và sử dụng mật khẩu mạnh. Loại bảo mật đó thường được thử nghiệm tốt, được tin cậy rộng rãi và thường có sẵn.