簡體   English   中英

在Java / Scala中重現CouchDB 1.2.0密碼哈希函數

[英]Reproducing CouchDB 1.2.0 password hash function in Java/Scala

我有一個簡單的設置,將應用程序服務器備份到CouchDB,在其中我對應用程序服務器的用戶使用CouchDB的內置用戶身份驗證。 應用服務器可以訪問_users數據庫並檢索用戶的文檔。

我正在嘗試復制密碼哈希函數,以便無需驗證CouchDB就可以在應用服務器中驗證用戶的密碼。

CouchDB安全規范指出:

“ password_sha”屬性是SHA-1哈希值的十六進制表示形式,該值是在與用鹽(最好是隨機字符串)連接的用戶密碼匹配的字符串上計算得出的。 salt屬性是用於生成用戶密碼哈希的salt的十六進制表示形式。

從CouchDB 1.2.0開始,當用戶文檔中存在密碼字段時,將自動創建password_sha和salt字段。 編寫用戶文檔時,CouchDB會檢查密碼字段是否存在,如果存在,它將生成一個鹽,對密碼字段的值進行哈希處理,並對密碼哈希值和鹽的串聯進行哈希處理。 然后,它將生成的密碼寫入password_sha字段,並將salt寫入salt字段。 密碼字段被刪除。

相關源代碼:

% Lines 72-74 of couch_httpd_auth.erl

UserSalt = couch_util:get_value(<<"salt">>, UserProps, <<>>),
PasswordHash = hash_password(?l2b(Pass), UserSalt),
ExpectedHash = couch_util:get_value(<<"password_sha">>, UserProps, nil),

% Lines 237-238 of couch_httpd_auth.erl

hash_password(Password, Salt) ->
    ?l2b(couch_util:to_hex(crypto:sha(<<Password/binary, Salt/binary>>))).

這是我嘗試使用密碼為“ password”的測試用戶來復制它:

import java.security.MessageDigest
import org.apache.commons.codec.binary.Hex
import org.specs2.mutable.Specification

class PasswordSpec extends Specification {

    "Password" should {
        "match" in {

            val password = "password"

            val hexEncodedPasswordHash = "0fed560a9928b50761ebec5aa97c815999e6def0"
            val hexEncodedSalt = "2ba345d5f2880fae25de9ec7a78d38ae"

            val charset = "UTF-8"
            val codec = new Hex(charset)

            val md = MessageDigest.getInstance("SHA-1")
            md.reset()
            md.update(password.getBytes(charset))
            md.update(codec.decode(hexEncodedSalt.getBytes(charset)))
            val hashBytes = md.digest()
            val hexEncodedHash = new String(codec.encode(hashBytes), charset)

            hexEncodedHash mustEqual(hexEncodedPasswordHash)

        }
    }
}

這項測試失敗了,我對為什么沒有足夠的想法。

我想到了。 鹽字節在與密碼字節連接之前不需要從十六進制解碼。

暫無
暫無

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

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