2013-07-18 87 views
5

我正在使用bcrypt來生成鹽和哈希密碼,但我不認爲它是非常安全的。 當我使用以下代碼:Bcrypt在散列密碼時不安全嗎?

bcrypt.genSalt(10, function(err, salt) { 
    user.salt = salt; 
    bcrypt.hash(password, salt, function(err, hash) { 
    user.hashed_password = hash; 
    console.log(user.salt); 
    console.log(user.hashed_password); 
    user.save(function(err) { 
     if (err) console.log(err); 
     console.log("saved"); 
    }); 
    }); 
}); 

在一個實例中,所述鹽是:$2a$10$mFFjRpY1Vrq7Fy1fFp0fMO和hashed_pa​​ssword是:$2a$10$mFFjRpY1Vrq7Fy1fFp0fMOVnlv9cKgAFdCQ5xdtlP6UoKz90i1FMu

哈希密碼的開始是完全相同的作爲鹽。如果攻擊者能夠訪問salt,那麼他是不是可以從hashed_pa​​ssword中刪除salt,或者使用蠻力或者使用預先確定的哈希值來確定密碼?

我一直以爲這應該是散列密碼的順序:

hash(salt + password) 

不:

salt + hash(password) 

回答

17

哈希密碼的開始是鹽,因爲你需要訪問鹽以驗證密碼。

你看到的數據既不是哈希(鹽+密碼),也沒有鹽+哈希(密碼) - 這是形式的

salt + hash(salt + password) 

如果一個攻擊者能夠訪問這些數據,則:

  • 他們當然可以(理論上)蠻力的密碼 - 沒有技術可以防止這種情況,但速率限制使得攻擊不切實際。本例中使用的散列函數專門設計爲需要很長時間才能運行,並間接限制攻擊速度。
  • 他們不能使用一個標準的散列表來找出密碼 - 這是因爲哈希值也包含獨特的鹽。當然鹽在那裏是清楚的,所以可以計算一張表,但是由於鹽對於每個哈希密碼都是唯一的,所以這不比強力攻擊更好。