過去 N 天的登錄次數證明,不保存登錄時間
假設我們有一個使用者 Bob。使用者 Bob 每隔一段時間就會登錄到我們的Web應用程序。我們是一個網站,試圖盡可能少地保存有關我們使用者的資訊,但是我們想知道哪些使用者處於非活動狀態,以便我們可以暫停他們的帳戶。
有什麼方法可以保存有關 Bobs 登錄的資訊,這種方式不會告訴我們任何關於他何時登錄的資訊,而是告訴我們 Bob 在過去
n
幾天登錄了多少次?假設一切都在伺服器端完成,我們唯一要防止的是在數據庫洩露或類似情況下發生數據洩漏。
我不確定密碼學是否可行。一天級別的計數器就足夠了,以後可能會聚合到更粗略的解析度並刪除您不再需要的任何舊資訊。
如果您想以最近 N 天的特定解析度準確計算過去 N 天,則必須保留有關您在 N 天前所做的事情的資訊。可以通過查詢count,過一會再查詢來推斷。但是你也許可以做一些更模糊的事情,也許將一些使用者數據儲存在一起,如果他們一起沒有達到門檻值,則停用一個使用者組,並定期替換哪些使用者被分組在一起。
有什麼方法可以保存有關 Bobs 登錄的資訊,這種方式不會告訴我們任何關於他何時登錄的資訊,而是告訴我們 Bob 在過去 n 天內登錄了多少次?
實際上(理論上)是的,即使沒有呼叫完全同態加密。“僅僅”基於電路的可隨機化功能加密(我稱之為 CRFE)就足夠了。
也就是說,它的美妙之處在於您需要的功能實際上都是一元功能:
- 將使用者今天訪問的網站記錄到日誌中。
- 將日誌轉移到新的一天,刪除舊條目。
- 提取日誌中訪問的天數是否超過固定門檻值。
現在假設您有一個 CRFE 方案。然後,您的日誌記錄的設置階段將是:
- 執行 CRFE 方案的設置算法,產生主公鑰 (MPK) 和主密鑰 (MSK)。
- 使用 MSK 生成密鑰 $ sk_\ell $ 對於函式 $ \ell(x;r)=\operatorname{Enc}_{MPK}(x\lor 1;r) $ ,即取解密值的函式,或將 1 置於其最低位位置,並使用提供的隨機性在公鑰下對其進行重新加密。
- 使用 MSK 生成密鑰 $ sk_u $ 對於函式 $ u(x;r)=\operatorname{Enc}_{MPK}((x\ll 1)\land 1^n;r) $ 它將明文向左移動,在最低位置添加一個 0 位,並使用長度為全一的字元串執行 AND 操作 $ n $ - 您要跟踪的天數,然後重新加密結果。
- 使用 MSK 生成密鑰 $ sk_a $ 對於函式 $ a(x;r)=\operatorname{HW}(x)\geq T $ 它計算解密值的漢明權重(非零位數)並將其與您的固定門檻值進行比較,僅輸出該比較的二進制結果。
- 安全刪除 MSK。
- 分發 $ sk_\ell $ 到您的登錄服務, $ sk_u $ 到您的每日數據庫更新服務和 $ sk_a $ 到您的“檢查使用者是否已登錄服務”,這最好比其他兩個更難破解,因為訪問此秘密,並且至少其中一個允許透露有關您的使用者登錄行為的一些資訊。
現在有了所有這些秘密,我們終於可以描述每個服務應該做什麼了:
- 每日數據庫更新服務應該鎖定使用者的行,獲取目前加密的日誌值,並使用 $ sk_u $ 並將結果寫回加密的日誌欄位並解鎖該行。
- 登錄服務應該鎖定登錄使用者的行,獲取目前加密的日誌值,並使用 $ sk_\ell $ 並將結果寫回加密的日誌欄位並解鎖該行。
- 使用者註冊服務應使用 MPK 加密全 0 字元串並將其寫入新使用者的加密日誌欄位。
- “檢測缺席使用者服務”應該鎖定使用者的行,獲取目前加密的日誌值,用 $ sk_a $ 如果它返回“1”,則聲明使用者處於活動狀態,否則聲明其處於非活動狀態並最終再次解鎖該行。
此處的“鎖定”和“解鎖”操作旨在強制執行原子更新並確保登錄和更新服務不會無意間干擾。
當然,上述內容並不能阻止細心的攻擊者簡單地將明文記錄器放入您的使用者登錄服務並以這種方式提取登錄行為。它也不會阻止學習了所有三個秘密的攻擊者學習登錄行為(因為他們可以根據需要進行 OR 和移位以從密文中恢復比特,知道他們添加了多少),但它應該將洩漏限制在大約 0如果 $ sk_a $ 不洩漏並將洩漏限制在大約 1 位,如果 $ sk_\ell $ 和 $ sk_a $ 被洩露到一個關於 $ n-T $ (?) 位如果 $ sk_u $ 和 $ sk_a $ 被洩露。
當然,我也不保證上述方案的實際性能。它可能太慢而無法實際使用,尤其是因為您需要對每次更新的功能進行重新加密。