1

アプリサーバーのユーザーに対してCouchDBの組み込みユーザー認証を使用しているCouchDBにバックアップされたアプリサーバーを使用した簡単なセットアップがあります。アプリ サーバーは _users データベースにアクセスして、ユーザーのドキュメントを取得できます。

CouchDB に対して認証することなく、アプリ サーバーでユーザーのパスワードを検証できるように、パスワード ハッシュ関数を複製しようとしています。

CouchDB のセキュリティ仕様には次のように記載されています。

「password_sha」属性は、salt で連結されたユーザー パスワードに一致する文字列 (理想的にはランダムな文字列) に対して計算された SHA-1 ハッシュの 16 進数表現です。salt 属性は、ユーザーのパスワード ハッシュの生成に使用されるソルトの 16 進数表現です。

CouchDB 1.2.0 以降、パスワード フィールドがユーザー ドキュメントに存在する場合、password_sha および salt フィールドが自動的に作成されます。ユーザー ドキュメントが作成されると、CouchDB はパスワード フィールドの存在をチェックし、存在する場合はソルトを生成し、パスワード フィールドの値をハッシュし、パスワード ハッシュとソルトの連結をハッシュします。次に、結果のパスワードを password_sha フィールドに書き込み、salt を salt フィールドに書き込みます。password` フィールドは削除されます。

関連するソース コード:

% 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)

        }
    }
}

このテストは失敗しており、その理由についてのアイデアが不足しています。

4

1 に答える 1

0

私はそれを考え出した。ソルト バイトは、パスワード バイトと連結する前に 16 進数からデコードする必要はありません。

于 2013-01-05T10:37:53.230 に答える