Public-Key

Zencash 使用您的密碼來辨識和解鎖錢包 - 這如何安全?

  • April 20, 2018

在查看 Zencash 時,我偶然發現了myzenwallet.io(由 Zencash 創建者提供),您可以選擇輸入密碼來生成錢包(看起來很正常),但是在創建錢包之後,您可以稍後再回來打開錢包只需再次重新輸入您的密碼……這是出乎意料的,讓我不僅想知道它是如何工作的,而且想知道將來是否會使用任何手段來實現這一目標。

鑑於我不需要辨識我正在解鎖的資源,而只是交出密碼,我只能假設他們的系統通過對我的密碼進行多次散列來生成我的“主地址”來生成令牌" 或 “賬戶 ID” (我只是編造了這些條款,因為 Zencash 給了你很多地址,所以我還假設你有某種主地址/賬戶 ID),然後也使用相同的密碼來鎖定/驗證(不是加密,對吧?)錢包。

我不知道 Zencash 是如何工作的。據我所知,他們以明文形式儲存所有數據。但我將解釋如何在某種程度上安全地完成這項工作,但仍然存在根本缺陷。

這裡的基本工具是密鑰推導函式。密鑰推導 $ F(P,L) $ 從密鑰計算一個值 $ P $ 和一個公共標籤 $ L $ 這樣:

  • 計算任何部分都是不可行的 $ P $ 即使你碰巧知道 $ F(P,L) $ 對於許多值 $ L $ .
  • 計算任何部分都是不可行的 $ F(P,L) $ 不知道 $ P $ , 即使你碰巧知道 $ F(P,L’) $ 對於很多 $ L’ \ne L $ .

以下協議允許站點使用您的密碼作為唯一輸入來儲存一些數據而無法解密它。

  • 你輸入你的密碼 $ P $ 在網頁上。瀏覽器不會將密碼發送到伺服器。
  • 瀏覽器計算兩者 $ A = F(P, \mathtt{“address”}) $ 和 $ K = F(P, \mathtt{“encryption”}) $ .
  • 瀏覽器發送 $ A $ 到伺服器。伺服器使用 $ A $ 檢索加密的 blob 數據並將此加密 blob 發送到瀏覽器。
  • 瀏覽器使用 $ K $ 解密數據。

在這種情況下,伺服器無法解密數據。請注意,您需要相信伺服器發送的 Javascript 程式碼正在做正確的事情。如果伺服器遭到入侵,它可能會開始發送新的 Javsscript 程式碼,該程式碼確實會將密碼片語發送到伺服器。

這種方法的根本缺陷是有人可以通過猜測某人的密碼來輕鬆竊取資金。這是使用密碼作為唯一辨識方法所固有的:它允許大規模的非目標攻擊。如果您能猜出任何人的密碼,您就可以檢索他們的數據。你不需要知道他們是誰:只要不斷猜測潛在的密碼,直到你找到一個錢包不空的密碼。

使用密碼來保護某些東西的合理系統總是在標籤中包含用於密鑰派生的鹽。每個密碼的鹽是唯一的。它不需要保密,但是當您返回該站點時,您需要重新使用相同的鹽。使用鹽,不可能進行大規模的無目標攻擊。如果攻擊者猜測這squeamish ossifrage可能是一個密碼片語,他們仍然需要使用每個可能的鹽值進行嘗試。

為了完整起見,請注意,當從密碼片語派生密鑰時,除了使用鹽之外,還需要應用拉伸機制以使計算速度變慢。這與密碼散列相同的問題。事實上,密碼散列和基於密碼的密鑰派生是非常接近的密碼學問題。

如果不是人類選擇的密碼片語,而是基於足夠長的隨機生成的字元串,那麼上面的協議將是安全的。人工選擇的密碼片語的問題在於它們的熵非常小:列舉所有可能的密碼片語相對容易。更糟糕的是,在這種情況下,攻擊者只關心最弱的密碼,他們通常不會嘗試攻擊可能特別小心選擇強密碼的特定使用者。但是,即使是從 100,000 個字典(包括一些非常晦澀的單詞)中選擇由 4 個隨機單片語成的密碼片語的使用者也僅達到 66 位熵,而用作秘密的隨機字元串的標準最小大小是 128 位,對於金融應用程序,最好使用 256 位。如果密碼是一個語法句子,熵的量就會大大減少。

引用自:https://crypto.stackexchange.com/questions/58502