2016-12-29 84 views
0

在客戶端設備上,同步的Realm可以使用加密密鑰進行設置,該加密密鑰對用戶是唯一的,並存儲在設備密鑰鏈中,因此數據在客戶端進行加密存儲。 (相關問題:Can "data at rest" in the Realm Mobile Platform be encrypted?Realm移動平臺可以實現端到端的加密嗎?

Realm對象服務器和客戶端可以通過TLS進行通信,因此數據在傳輸過程中進行加密。

但由於管理員用戶能夠通過Realm Browser(https://realm.io/docs/realm-object-server/#data-browser)訪問所有數據庫內容,所以Realm對象服務器似乎不使用加密存儲數據。

是否有可能設置Realm移動平臺,以便用戶數據端對端加密,如沒有人但用戶(甚至服務器管理員)無權訪問解密密鑰?

+0

端到端加密與靜態加密之間存在差異。想想你的Whatsapp聊天:有e2e加密,聊天中的兩部分都能看到內容。如果您不希望服務器管理員訪問您的數據,那麼在離開它之前應該在設備上加密數據。這樣加密密鑰將保留在設備上,並且數據在服務器上不可用。 – Orlando

+0

所以看起來,實現這一目標的唯一方法是使用存儲在設備鑰匙串上的密鑰手動加密我的Realm模型中的所有字段?但是,這將破壞Realm Mobile Platform的「同步」功能,除非我還可以在用戶設備之間同步該加密密鑰(使用第三方安全同步機制,如iCloud Keychain)。也許可行但不太實際。 – ewerx

+0

這取決於您正在存儲的數據的類型。如果你正在用戶之間進行聊天,那麼e2e加密是有道理的。在任何其他情況下,我認爲您的報價可以使用設備上的密碼加密數據,並且在其他設備上需要使用相同密碼才能解密數據。我不知道這是否可擴展。無論如何,這是加密筆記在Evernote時間前工作的方式(我不再是Evernote用戶)。請檢查您的選項。你必須選擇。 – Orlando

回答

2

由於我們處理衝突解決的方式,我們目前無法提供端到端的加密,正如您正確推斷的。關於衝突解決方案,我們稍微詳細一點。

爲了處理衝突的方式我們使用的東西叫operational transformation。這意味着客戶不是直接發送數據,而是告訴服務器更改的意圖,而不是結果。例如,當兩個用戶編輯一個文本字段時,我們會告訴服務器insert(data='new text', offset=0),因爲第一個用戶在文本字段的開頭添加了數據,而insert(data='some more stuff', offset=10)因爲第二個用戶在字段中間添加了數據。這兩個單獨的操作允許服務器唯一地解決發生的事情,並且對這兩個寫入進行無衝突的解析。

這也意味着如果我們加密所有的東西,服務器將無法處理這個衝突解決方案。

這就是說,這是目前的版本。我們對於未來如何處理這一問題確實有一些想法,同時提供(某種程度)的加密。主要是這意味着客戶需要更多的工作,並且可能會找到一種新的算法來讓我們告訴客戶這個意圖,並讓客戶弄清楚如何合併一切。但這是一個二次問題,所以我們不願意在客戶端做太多的工作,因爲它可能真的耗盡電池。

這對某些用戶來說可能是可以接受的,這就是爲什麼我們正在研究它。基本上會有一個折衷。正如古老的格言所言:快速,安全,方便:挑選兩個。我們只需要弄清楚如何正確處理這個問題。

1

我剛剛打開一個功能請求,可能使用Tresorit的ZeroKit來解決端到端加密問題。聽起來衝突解決方案的實現仍然會引起問題,但是也許有不同的衝突解決方案級別,可以應用於那些不需要實時動態編輯單個數據字段的衝突解決方案級別(如患者健康數據,只有單一臨牀醫生在任何時候都會真正編輯記錄)。

https://github.com/realm/realm-mobile-platform/issues/96

相關問題