コマンドラインからbcryptハッシュを計算する


17

パスワードのbcryptハッシュを計算したいと思います。

それを行うオープンソースのコマンドラインツールはありますか?

Syncthing構成ファイルでこのハッシュを使用します(ここから、構成ファイルを編集してguiセクションのユーザーとパスワードを削除し、Syncthingを再起動することでパスワードをリセットできることがわかっていても)。

回答:


24

バージョン2.4以降を使用している場合htpasswdapache-utilsパッケージから(ab)useできます。

htpasswd -bnBC 10 "" password | tr -d ':\n'

-b2番目のコマンド引数からパスワード
-nを取得し、ハッシュをファイルに書き込む代わりにstdoutに出力
-Bします。bcryptを使用するように指示すると
-C 10、bcrypt コストが10に設定されます。

bare htpasswdコマンドは、<name>:<hash>の形式で出力し、その後に2つの改行が続きます。したがって、名前の空の文字列とtrコロンと改行を削除します。

このコマンドは、$2y$接頭辞付きのbcryptを出力しますが、これは用途によっては問題になる可能性がありますが、使用sedするOpenBSDバリアントはを使用$2a$する固定crypt_blowfishバリアントと互換性があるため、別のユーザが簡単に修正できます$2y$

htpasswd -bnBC 10 "" password | tr -d ':\n' | sed 's/$2y/$2a/'

htpasswdのmanページへのリンク:https://httpd.apache.org/docs/2.4/programs/htpasswd.html
:bcryptの変種についての詳細/programming//a/36225192/6732096


このバージョンには、Java Spring SecurityのBCrypt実装に問題があります。ハッシュするパスワードはヌル文字で終了する必要があります。Spring Securityはそれを正しくしているようです。htpasswdはこれを正しく行っていないと思います。
k_o_

@k_o_:「問題を抱えています」についてもっと具体的に教えてください。すべてのbcrypt実装は、ヌル文字ターミネーターを使用します。py-bcryptのようなものの中には、ヌル文字がパスワードの一部ではないことを確認するための追加のチェックを備えているものもあります。GitHubでApacheの実装を確認できます。私はhtpasswdに追加のsedを使用して、複数のSpringアプリケーションのデータベースレコードに問題なく入力します(実際に答えを得る方法です)。
逆アセンブラー

Springとhtpasswdの異なるエンコーディングを説明するために、null文字を省くことはhtpasswdの問題だと思っていました。他の回答のPythonアプローチを使用したbcryptの出力は、Springと同じ結果を生成していましたが、htpasswdはそうではありませんでした。たぶん、私のhtpasswdバージョンはかなり古いので、バイナリは2年以来更新されていないと思います。
k_o_

11

Pythonライブラリを使用できます。私のFedoraシステムでは、次のことを行いました。

sudo dnf search bcrypt

(sudoはユーザーのdnfキャッシュ用のスペースを無駄にしないためです)、結果からPython2およびPython3パッケージがあることがわかります:

py-bcrypt.x86_64 : Python bindings for OpenBSD's Blowfish password hashing code
python3-py-bcrypt.x86_64 : Python 3 bindings for OpenBSD's Blowfish password hashing code

Python2バージョンをインストールし、パッケージ内のファイルをリストします。

sudo dnf install py-bcrypt.x86_64
rpm -ql py-bcrypt.x86_64

これはファイルがある/usr/lib64/python2.7/site-packages/bcrypt/__init__.pyことを示しているので、ドキュメントを取得できます

pydoc bcrypt

これは、文字列をハッシュする次のコマンドを書くのに十分なことを示しています"password"

$ python -c 'import bcrypt; print(bcrypt.hashpw("password", bcrypt.gensalt(log_rounds=10)))'
$2a$10$vWFRZgbOx6RKOKYxCTtyWuMJM60E90Vdm/.0nj.X/o3dYUxvQ/2Dm

以降のバージョンでbcryptは、のrounds=代わりに使用しますlog_rounds=


2
+1。FTRは、あなたが必要としないsudo実行するためにdnf search、それは標準ユーザーとして罰金に動作します。
スティーブンキット

1
2018年4月の時点で、パラメータlog_roundsは変更されたroundsようpython -c 'import bcrypt; print(bcrypt.hashpw("password", bcrypt.gensalt(rounds=10)))'です。
-HorstKevin

4

@Disassemblerの回答に追加:

  • コマンドラインからパスワードを渡すことはお勧めできません(パスワードはで表示できるためps
  • 15 複雑さとパスワードの生成速度のバランスが良い

htpasswd&のラッパースクリプトbcrypt

#!/bin/sh

## bcrypt passwd generator ##
#############################
CMD=$(which htpasswd 2>/dev/null)
OPTS="-nBC 15"
USERNAME=$1

usage() {
        local script=$(basename $0)
        cat <<EOF
$script: Generate Bcrypt Hashed Passwords using htpasswd

Usage: $script username
EOF
        exit 1
}

check_config() {
    if [ -z $CMD ]; then
        printf "Exiting: htpasswd is missing.\n"
        exit 1
    fi

    if [ -z "$USERNAME" ]; then
            usage
    fi
}

check_config $USERNAME
printf "Generating Bcrypt hash for username: $USERNAME\n\n"
$CMD $OPTS $USERNAME
exit $?

1
また、スペースを使用してコマンドラインを起動しない限り、パスワードはシェル履歴(おそらく暗号化されていないファイル)に移動します。
ガブリエルデヴィラーズ

@GabrielDevillersうん、ここも同じ。OPTSに「-i」を、最後から2番目の行に「」を追加しました。
トウィ

rootユーザーのBASH&mySQL履歴については、へのシンボリックリンクを作成することをお勧めします/dev/null
スチュアートカーダル

1
@GabrielDevillersのコメントについては、最初にスペースを追加してもシェルの履歴から項目が常に表示されるとは限らないことに注意してください。シェルと設定によって異なります。
震え
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.