Hướng dẫn trao đổi khóa trong app chat End to End

Xin chào anh chị DNH,

Hiện tại database app chat của em đang lưu tin nhắn plaintext. Em muốn mã hóa tin nhắn bằng thuật toán RSA, phát sinh khóa, mã hóa và giải mã tin nhắn diễn ra ở browser, text sau khi mã hóa chuyển sang base64 để lưu vào database vì vậy sẽ giải quyết được vấn đề admin không đọc được tin nhắn hoặc nếu bị hack database hay làm mất file backup database thì hacker không đọc được tin nhắn.

Em đang gặp vấn đề là không biết lưu trữ private key như thế nào cho đúng. Hiện tại em đang hy sinh UX để dùng cách này: Sau khi tạo tài khoản, web sẽ generate ra cặp key, database không lưu private key mà đưa private key cho user tự lưu trữ (nếu làm mất private này xem như không đọc được tin nhắn nữa) Mỗi lần đăng nhập thì user phải nhập thủ công private key để xem tin nhắn (lưu vào localStorage để cache private key)

Mong được tư vấn. Em cảm ơn!

private key này thì đi tài khoản user, thì thông tin user chỉ cần thêm field chứa private key (sau đây gọi là key cho gọn) là được rồi
đến đây thì giải quyết được 1/2 vấn đề, là lưu tr key ở đâu và cũng giải quyết được chuyện transfer key từ đâu đi đâu

1/2 vấn đề còn lại là làm sao để admin không đọc được key trong khi key lại lưu trong database?
câu trả lời là rsa có option password, nghĩa là ngoài private key ra, thì vẫn cần thêm password để giải mã
=> bạn cho phép người dùng tạo, hoặc gen ra một cái passphrase cho việc giải mã này lúc đăng kí account, người dùng cần nhớ đoạn này (hoặc dùng chung với password login luôn cũng được, rsa cũng cho phép đổi passphrase)

4 Likes

update: một giải pháp khác mà bạn có thể sử dụng là lưu private key dưới dạng mã hoá ( có thể dùng user password để mã hoá, mỗi lần đổi pass thì lại dùng pass cũ giải mã ra được private key rồi lại mã hoá private key lại bằng password mới)
vì admin không đọc được password của user (thường lưu dưới dạng hash, khi compare thì chỉ compare hash) nên cách này vẫn đáp ứng được

2 Likes

Cảm ơn anh đã phản hồi, vậy là thao tác decrypt tin nhắn diễn ra ở phía server rồi server mới gửi plaintext đã giải mã đó về cho browser thông qua HTTPS/SSL đúng không?

đây là flow do bạn design thôi, nên mình cũng không có ý kiến
nhưng mà ở đây có vấn đề, conversation của bạn đang lưu trữ nữa thế nào với rsa
nếu A muốn xem lại tin nhắn cũ của A với B, bản thân A có private key của A thì có thể xem được tin nhắn mà B đã gửi cho A (vì gửi cho A sẽ đùng public key của A để mã hoá)
nhưng làm sao A coi lại được tin nhắn mà mình đã gửi B (A đâu có private key của B?)

Vì thế, bạn cần có một db design hoặc yêu cầu (businesss) cụ thể hơn thì mọi người mới có thể tư vấn được

5 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?