簡體   English   中英

通過MessageDigest了解Java中的散列密碼

[英]Understanding hashing passwords in Java by MessageDigest

我正在創建一個簡單的Web應用程序,並希望將散列密碼存儲到數據庫中。 我也需要身份驗證令牌的哈希函數(連接用戶名和日期,並將它們的哈希值作為令牌發送給客戶端)。

我發現MessageDigest Java類可以幫助我解決這個問題。 這是一個鏈接 基本想法是這樣的:

public String digestString (String stringToHash) throws NoSuchAlgorithmException {
    MessageDigest sha256 = MessageDigest.getInstance("SHA-256");        
    byte[] stringBytes = stringToHash.getBytes();
    byte[] stringDigest = sha256.digest(stringBytes);
    return new String(stringDigest);
}

我得不到的是:在這段代碼中,我該如何設置哈希鍵? 我需要確保在驗證過程中使用相同的密鑰。 如果我沒有設置密鑰,我怎么能這樣做?

順便說一句:我知道我應該在哈希值之前添加一個鹽(在這種情況下為256字節)到散列文本。

哈希不使用密鑰。 這只是一種單向算法。 你給它一些消化的東西,然后它返回一個哈希值。 它保證的是,找到導致相同散列的原始輸入或任何其他輸入非常困難。

您的算法有兩個基本問題(除了缺少鹽析):

  • 它使用String.getBytes(),它依賴於默認的平台編碼,因此不同於平台。 您應該指定一個編碼,如UTF-8。
  • 它使用新的String(byte []),它有與上面相同的問題+另外一個:所有字節序列都不是有效字符。 要將純二進制字節數組轉換為String,請使用base64編碼算法。 apache commons代碼有一個。

暫無
暫無

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

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