簡體   English   中英

BCrypt:如何從我正在散列的字符串中生成鹽?

[英]BCrypt: how can I generate a salt from the string I am hashing?

簡短的問題:我不想使用bcrypt隨機生成的鹽。 假設我正在哈希的密碼是“abcd1234”。 在過去的好日子里,鹽將是“ab”或“abcd”或“abcd12”,換句話說,鹽將是密碼的前N個字符,其中N是密碼所需的最小長度。 那么如何從密碼本身生成有效的bcrypt鹽呢?

長問題:我正在使用消息傳遞系統,換句話說,消息將在內部發送以進行身份​​驗證,並且由於顯而易見的原因,我不能在此消息中包含純文本密碼。 所以流程應該是這樣的:

  • 機器A以明文形式獲取密碼
  • 機器A使用bcrypt對密碼進行哈希處理
  • 散列(即安全)密碼在我的內部消息中發送
  • 機器B是具有散列密碼數據庫的認證機器,它獲取消息,現在它必須將它收到的散列密碼與數據庫中的散列密碼進行比較以進行認證。

但是,如果BCrypt不允許我使用從我的純文本密碼派生的鹽,我怎么能這樣做呢? 機器A對任何鹽都一無所知。 它沒有對數據庫的任何訪問權限。 機器B是知道這一點的人。 所以必須有一種方法從“abcd1234”派生我的bcrypt鹽,或者bcrypt應該有一個方法:

check(String hashedPasswordWithSaltA, String hashedPasswordWithSaltB);

用簡單的術語來說明:機器A獲取密碼,機器B是具有認證數據庫的機器。 我不想將明文密碼從A傳遞給B,但看起來像bcrypt迫使我這樣做。 :(

只需使用哈希密碼傳輸salt即可。 對密碼進行腌制的要點是,在數據庫中,明文中相同的兩個密碼具有不同的哈希值。 如果從密碼本身生成此salt,則此邏輯會失效。 此外,至於解密目的,您必須以純文本形式存儲salt,您實際上是泄露了一大塊用戶密碼。

TLDR:讓Bcrypt為您生成鹽。 然后用散列密碼傳輸鹽。 鹽不是秘密的。

實際上有兩種方法可以解決這個問題。

1)每個網站都有這個問題,因為密碼必須發送到服務器。 這通常通過使用加密連接(HTTPS / SSL)來解決。 密碼只會被加密(雙向),傳輸到machine2(服務器),解密后再進行哈希處理。

2)您可以使用隨機鹽在BC機器上使用BCrypt散列密碼,將其發送到machine2並存儲散列。 要驗證密碼,machine1首先必須向machine2詢問使用過的salt,然后使用此salt哈希密碼,然后將哈希值發送到machine2。 Machine2可以驗證密碼,因為使用了相同的鹽。

我快速瀏覽了一個jBCrypt示例 ,似乎您可以自己生成鹽並將其作為參數傳遞。 所以你實際上可以從密碼中驅除鹽,但這會使鹽變得無用,它變成了一個更復雜的哈希函數。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM