MongoDB
 sql >> Cơ Sở Dữ Liệu >  >> NoSQL >> MongoDB

Sử dụng các _id được tạo trong MongoDB làm dữ liệu bí mật (ví dụ:Mã thông báo OAuth)

Trong ngắn hạn, không. Mongo ObjectIds rất dễ đoán. Đặc biệt, dưới mức tải cao, đây thường là các số liên tiếp, vì dấu thời gian, id máy và quy trình không thay đổi. Nếu bạn xem cấu trúc của Objectid , chúng bao gồm

a 4-byte timestamp, 
a 3-byte machine identifier, 
a 2-byte process id, and 
a 3-byte counter, starting with a random value.

Do đó, chúng có rất ít ngẫu nhiên. Tôi thường thấy các id liên tiếp trong cơ sở dữ liệu, chẳng hạn như nếu một số hành động của bộ điều khiển ghi một đối tượng miền và một mục nhật ký liên tiếp nhanh chóng.

Nếu dấu thời gian có thể được đoán và id máy có thể xác định được (trừ khi bạn có một cụm lớn), thì chỉ còn lại năm byte. Bằng cách xem xét một số id được tạo, tôi có thể giảm số đó xuống còn 50 quy trình để entropy hiệu quả nằm ở đâu đó trong phạm vi 28 bit. Điều này vẫn khó đoán, nhưng nó quá rủi ro đối với mã thông báo truy cập.

Thay vào đó, hãy sử dụng trình tạo số ngẫu nhiên giả mạnh về mặt mật mã và tạo mã thông báo từ đó. Ví dụ:trong .NET, RNGCryptoServiceProvider cho phép tạo dữ liệu ngẫu nhiên có độ dài tùy ý.

Như một chú thích phụ, tôi khuyên bạn nên có thêm một trình bao bọc mật mã xung quanh OAuthTokens của bạn, vì hai lý do:

a) Bạn muốn có thể xác định các mã thông báo không hợp lệ một cách nhanh chóng. Một trình bao mật mã hợp lệ có thể vẫn bao gồm một mã thông báo không hợp lệ (một khoản tài trợ đã bị thu hồi hoặc hết hạn), nhưng bạn không phải truy cập cơ sở dữ liệu về các cuộc tấn công brute force mọi lúc. Ngoài ra, khách hàng

b) Khách hàng có thể yêu cầu mã thông báo nhiều lần. Mặc dù nó không phải là một yêu cầu, nhưng hầu như tất cả các hệ thống tôi biết đều trả về các mã thông báo khác nhau mỗi lần (bất kể chúng có đang tự xác thực hay không). Thông thường, đó là vì bản thân mã thông báo có thời hạn hiệu lực giới hạn. Đó không phải là cùng thời hạn hiệu lực mà khoản cấp OAuth có.

Trong cơ sở dữ liệu, những gì bạn thực sự muốn lưu trữ là quyền cấp, tức là quyền được một số người dùng cấp cho một số ứng dụng khách. Nếu khoản trợ cấp này bị xóa, tất cả các mã thông báo sẽ trở nên không hợp lệ. Việc chèn mã thông báo mới mỗi lần là rất không hợp lý vì người dùng sẽ phải xóa tất cả chúng để loại bỏ hiệu quả việc cấp ứng dụng.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Làm cách nào để trả về phần tử mà tôi đang tìm kiếm bên trong một mảng lồng nhau?

  2. Cách tạo trường mảng mới với khung tổng hợp

  3. systemctl không tìm thấy trong khi xây dựng hình ảnh mongo

  4. Django không thể kết nối với tập bản đồ mongoDB

  5. mongoose:tìm dữ liệu bằng cách lặp lại trên một mảng mô hình