Add end-to-end encryption for chat messages (X25519 / NaCl box)
Messages between matched users are now encrypted client-side with each user's own key pair before they ever reach the server; the backend only ever stores/relays opaque ciphertext + nonce and cannot read message content, including for the last-message preview on the matches list. - User gains a PublicKey field, registered/rotated via PUT /profile/public-key - Message gains CipherText/Nonce; legacy plaintext Text is kept as-is for messages sent before this change - MatchView exposes the partner's public key and the last message's ciphertext/nonce so the client can decrypt previews itself - Removed the now-dead plaintext SanitizeMessageText utility — the server can no longer sanitize message content since it's opaque ciphertext Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -55,14 +55,20 @@ func (Match) TableName() string {
|
||||
return "matches"
|
||||
}
|
||||
|
||||
// Message یک پیام متنی داخل یک مچ
|
||||
// Message یک پیام داخل یک مچ. از رمزنگاری سرتاسری (E2EE) استفاده میشه:
|
||||
// سرور فقط CipherText+Nonce (خروجی رمزنگاریشدهی سمت کلاینت با NaCl box،
|
||||
// X25519-XSalsa20-Poly1305) رو ذخیره میکنه و هیچوقت متن خام پیام رو نمیبینه.
|
||||
// Text قدیمی (قبل از اضافه شدن E2EE) برای نمایش پیامهای تاریخی نگه داشته میشه؛
|
||||
// پیامهای جدید Text خالی دارن و بهجاش CipherText/Nonce پر میشه.
|
||||
type Message struct {
|
||||
ID uint `gorm:"primaryKey" json:"id"`
|
||||
MatchID uint `gorm:"not null;index" json:"match_id"`
|
||||
SenderID uint `gorm:"not null" json:"sender_id"`
|
||||
Text string `gorm:"size:2000;not null" json:"text"`
|
||||
ReadAt *time.Time `json:"read_at,omitempty"`
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
ID uint `gorm:"primaryKey" json:"id"`
|
||||
MatchID uint `gorm:"not null;index" json:"match_id"`
|
||||
SenderID uint `gorm:"not null" json:"sender_id"`
|
||||
Text string `gorm:"size:2000;not null" json:"text"`
|
||||
CipherText *string `gorm:"size:12000" json:"cipher_text,omitempty"`
|
||||
Nonce *string `gorm:"size:64" json:"nonce,omitempty"`
|
||||
ReadAt *time.Time `json:"read_at,omitempty"`
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
}
|
||||
|
||||
func (Message) TableName() string {
|
||||
|
||||
Reference in New Issue
Block a user