Blockchain

如何對使用者的私有數據實現基於角色的訪問控制?

  • August 10, 2018

我們有這個應用場景,並嘗試看看乙太坊或一般的區塊鍊是否是一個很好的解決方案。

基本思想是使用者控制少量私人敏感數據(例如,個人資料更改歷史、交易歷史)。使用者可以控制誰有權訪問該數據。當使用者 A 為另一個使用者 B 切換訪問權限時,B 可以看到整個交易歷史記錄。顯然,其他沒有訪問權限的使用者不應該看到 A 的數據。

我們正在考慮將使用者的加密數據儲存在公共區塊鏈中。乙太坊是我們正在考慮的選項之一。這樣做的好處是:

  • 去中心化或零停機時間
  • 任何有權訪問的使用者都可以看到不可更改的交易記錄(有利於審計)

問題

  • 您將如何對內容加密密鑰實施基於角色的訪問控制

顯然我們不能用使用者自己的私鑰對內容進行加密,否則當使用者想要共享數據時,他/她將不得不放棄私鑰才能解密內容。

所以每個私有數據單元都應該有一個唯一的加密密鑰。每次使用者撤銷其他人的訪問權限時,我們都必須更改加密密鑰並重新加密內容。

所以這就引出了另一個問題:

  • 我們應該在哪裡儲存這些加密密鑰

我們應該將它們儲存在私有數據庫中嗎?一個更普遍的問題是,既然區塊鏈實現了在公共共享賬本中的所有權跟踪,那麼它是否也可以對公共鏈中的所有內容(除了使用者的私鑰)也完全實現基於角色的訪問控制?

更新

感謝 Rob Hitchens 的回答。我閱讀了Vitalik 的博文,發現很難在鏈上實現混淆計算。所以不可能在保護使用者數據隱私的同時將所有東西都儲存在公鏈上。

這要求我們需要某種私有儲存來實現隱私。一種想法是使用公共鏈僅用於權限記錄保存。例如,我們聲明

mapping (address => bool) permissions;

並且只能sender分配設置任何帳戶的權限為真或假。我們的私有認證伺服器尊重這個權限映射(儲存在公共鏈中),並且只允許經過認證的使用者(即擁有授權賬戶的私鑰的使用者)訪問內容加密密鑰。

如果我們使用上面的設計,為了驗證自己,賬戶所有者需要使用私鑰來計算簽名,並且驗證伺服器需要驗證這一點。這似乎類似於在乙太坊交易中驗證身份的方式。

上述方法會奏效嗎?或者更重要的是,有沒有更好的設計?

同意 Sanchit 關於使用修飾符來控制對函式的訪問。

但是,範例實現具有誤導性。我會標記它進行重新設計。

有幾件事需要考慮。

就數據儲存而言,您可能需要考慮使用加密的鏈下序列化。這是為了在不影響應用程序分佈式特性的情況下降低整體儲存成本。

為了隱私,我知道你知道乙太坊中的資訊對所有各方都是可見的。考慮使用帶有智能合約的多方加密來幫助將“秘密”分發給多個授權方。

對於可擴展性,@Sanchit 的修飾符需要消除無界for循環。簡單地說,for(i=0;i<n;i++) 是一種反模式。在某些n情況下,執行成本將超過塊 gasLimit,這意味著它在所有情況下都會失敗。換句話說,以這種方式實現可以保證成功的應用程序最終會失敗,並且可能以無法修復的方式失敗。

在以伺服器為中心的世界中,所顯示的內容是完全合乎邏輯的。在乙太坊中,任何規模的所有功能都需要(大約)固定的 gas 成本。一種解決方案是使用mapping.

之所以提到這一點,是因為很多契約中都存在這個錯誤,我希望答案(我一般同意)不會導致編碼人員複製這種缺陷。

希望能幫助到你。

引用自:https://ethereum.stackexchange.com/questions/18058