Passwords
如何安全地控制訪問程式碼?
註冊後,使用者必須指定一個五位數的訪問程式碼。此訪問程式碼還用作加密和解密某些字元串的密碼。
使用者輸入“12345”(ACCESS_CODE)。
顯然,我們不想在設備上保存這個訪問程式碼。
現在,當使用者想要解密時,他輸入訪問程式碼,如果程式碼正確,解密就會成功。
但是,最好在解密之前檢查訪問程式碼是否正確,而不是將其保存在設備上。
如何做到這一點?
我想的一種方法是用訪問程式碼加密字元串“CHECKSTRING”。然後檢查將是:
- 使用 ACCESS_CODE 解密加密的 “CHECKSTRING” (ENCR_STRING) –> (DECR_STRING)
- 檢查 DEC_STRING == “CHECKSTRING” 是否正確,否則不正確。
但這對我來說似乎很不安全,因為有人可以為 12345 的所有組合模擬“CHECKSTRING”(在程式碼中已知且可見)的加密,然後交叉匹配我用來獲取 ENCR_STRING 的程式碼。
還有哪些其他選擇?
所以你有一個低熵的秘密,你想以一種安全的方式驗證它。
這是基於密碼的密碼學中的標準場景(PIN 是一種密碼)。
在下面描述的兩種情況下您將做什麼:
使用者首先輸入他的訪問程式碼 (=PIN),該程式碼被記憶體在 RAM 中。現在儲存媒體(設備/驅動器)將為程序(處理器)提供媒體儲存的隨機字元串。(這是鹽)媒體也提供參數。(迭代計數,(N,R,P)-值,(t_cost,m_cost)-值)。現在您使用提供的參數、鹽和密碼來使用密碼散列函式(PHC的 scrypt/winner)來派生標籤/密鑰。
您有兩種方法可以解決您的問題:
- 做你想做的事情的直接方法是獲取由 PHS(密碼雜湊方案)生成的標籤,將其儲存在儲存介質的第一個條目上(連同鹽和參數),然後檢查標籤是否與將在驗證時生成。
我不會推薦這種方式,因為它依賴於你的程式碼是沒有錯誤的。- 更好的方法(在我看來)是使用 PHS 派生密鑰,該密鑰將用於驗證/解密。因此,數據的安全性將強烈依賴於密碼,而不是某些授權碼。儲存介質只會儲存鹽和參數,您會看到訪問程式碼是正確的,因為驗證成功。