我在哪裡可以學習基本密碼學以了解有關密碼和比特幣的更多資訊?
基本上我在密碼方面的知識包括當時設置一個Diceware主密碼,而且我知道雜湊不能轉換回原始密碼。
我想知道答案的一些基本問題是如何從雜湊中預測密碼?就像可以知道確切或至少粗略地知道有多少個字元一樣?
您問題的核心是一個稱為*熵*的概念,它是一組數據中不確定性或不可預測性的數量。
在密碼學中,熵與機率有關,用 2(位)的冪表示。例如,公平的硬幣翻轉有一位熵:它可以是正面 (1) 或反面 (0)。拋四枚硬幣會給你 16 種可能的結果之一,因此它會給你 4 位熵。擲一個六面骰子會給你 2.6 位熵( $ 2^{2.6} = 6 $ ), 等等。用 5 個骰子生成的每個 Diceware 單詞都會為您提供 $ 2^{(2.6 * 5)} = 2^{13} $ ,或 13 位熵。最終,熵的位數表示測試每個可能的輸入所需的嘗試次數(也稱為蠻力攻擊)。
注意不要將密碼與密碼的雜湊混淆。SHA-1 雜湊是 160 位的數據,看起來非常隨機,因此它可能看起來有 160 位的熵。如果我要告訴我的電腦猜測 SHA-1 雜湊的所有可能值( $ 2^{160} $ ),這將比永遠花費更長的時間。但是,雜湊算法只是一種數學運算,它本身不會產生熵;雜湊摘要值包含的熵不超過輸入其輸入的熵量。如果我知道雜湊值是通過 SHA-1 算法執行使用者密碼的結果,作為攻擊者我不必嘗試所有 $ 2^{160} $ 可能的值。我只需要找出使用者可能為密碼選擇的所有值,然後自己通過雜湊算法執行它們。
因為使用者是人類,所以他們選擇的密碼通常基於他們的母語。如果您要猜測說英語的人的密碼,通常會從一系列常用的英語密碼開始,例如“god”、“admin”、“root”、“password”、“abc123”等,以及然後繼續測試英語詞典中的所有其他單詞。如果字典中有 200,000 個可能的單詞,那麼熵只有 18 位;電腦只需要幾毫秒就可以計算出 200,000 個單詞的雜湊值並測試每個單詞是否與給定的雜湊值匹配。
請注意,密碼限制會嚴重減少我必須測試的單詞數量。如果密碼策略說“密碼必須是 6 個字母長”,那麼我將首先測試所有六個字母的字典單詞,這比測試所有 200,000 個字典單詞要快。我們在所有密碼系統中假設的一件事是,攻擊者知道關於正在使用的系統的一切,而不是所涉及的秘密的值。
查看我上面連結的 wiki 頁面,以獲得對熵概念的相當易讀的介紹。
一個好的雜湊不會為您提供有關密碼長度或其他任何資訊的任何資訊。對這種散列的唯一攻擊是猜測密碼,然後使用散列來驗證它是否正確。
根據散列方案,每次猜測的成本可能會有很大差異。例如,使用普通的 MD5,單個顯卡每秒可以嘗試數十億次猜測。這就是我們使用慢速方案的原因,例如 scrypt、bcrypt 或 PBKDF2。