명령 줄에서 bcrypt 해시 계산


19

암호 의 bcrypt 해시 를 계산하고 싶습니다 .

그렇게하는 오픈 소스 명령 줄 도구가 있습니까?

동기화 구성 파일에서이 해시를 사용합니다 ( 여기서 gui 섹션에서 사용자 및 비밀번호를 제거하도록 구성 파일을 편집하여 비밀번호를 재설정 한 후 동기화를 다시 시작할 수 있음을 알고 있음에도 불구하고).

답변:


27

버전 2.4 이상인 경우 apache-utils 패키지 htpasswd에서 (ab) 사용할 수 있습니다 .

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

-b두 번째 명령 인수에서 암호를 가져옵니다
-n. 파일에 쓰는 대신 해시를 stdout에 인쇄 합니다. bcrypt
-B를 사용하도록 명령
-C 10하면 bcrypt 비용 이 10으로 설정됩니다.

bare htpasswd 명령은 <name> : <hash> 형식 으로 두 줄 바꿈을 출력합니다. 따라서 이름에 빈 문자열이 tr있고 콜론과 줄 바꿈이 제거됩니다.

이 명령은 $2y$접두어로 bcrypt를 출력 하는데, 일부 용도에서는 문제가 될 수 있지만 사용 sed하는 OpenBSD 변형 $2a$은를 사용하여 고정 된 crypt_blowfish 변형과 호환 되므로 다른 것으로 쉽게 고칠 수 있습니다 $2y$.

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

htpasswd 매뉴얼 페이지 링크 : https://httpd.apache.org/docs/2.4/programs/htpasswd.html
bcrypt 변형에 대한 세부 사항 : /programming//a/36225192/6732096


이 버전은 BCrypt의 Java Spring Security 구현에 문제점이 있습니다. 해시 할 비밀번호는 널 문자로 종료해야합니다. Spring Security가 올바르게하는 것처럼 보입니다. 나는 htpasswd가 이것을 올바르게하고 있지 않다고 생각합니다.
k_o_

@k_o_ : "문제가 있음"에 대해 더 구체적으로 설명 할 수 있습니까? 모든 bcrypt 구현은 널 문자 종결자를 사용합니다. py-bcrypt와 같은 일부는 널 문자가 비밀번호의 일부가 아닌지 확인하기 위해 추가 검사를 수행합니다. GitHub 에서 Apache 구현을 확인할 수 있습니다 . htpasswd를 추가 sed와 함께 사용하여 여러 Spring 응용 프로그램의 데이터베이스 레코드를 문제없이 채 웁니다 (실제로 대답합니다).
디스어셈블러

스프링과 htpasswd 사이의 다른 인코딩을 설명하기 위해 null 문자를 생략하는 것이 htpasswd의 문제라고 가정했습니다. 다른 답변의 Python 접근법을 사용한 bcrypt의 출력은 Spring과 같은 결과를 생성했지만 htpasswd는 그렇지 않았습니다. 어쩌면 내 htpasswd 버전이 상당히 오래된 것일 수도 있습니다 .2 년 후에 바이너리가 업데이트되지 않았다고 생각합니다.
k_o_

11

파이썬 라이브러리를 사용할 수 있습니다. 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표준 사용자로서 잘 작동합니다.
Stephen Kitt

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
그리고 공백으로 명령 행을 시작하지 않으면 비밀번호는 쉘 히스토리 (암호화되지 않은 파일)로 이동합니다.
Gabriel Devillers

@GabrielDevillers yup도 마찬가지입니다. OPTS에 "-i"를 추가하고 마지막 줄에 ""를 추가했습니다.
towi

root사용자의 BASH 및 mySQL 기록 의 경우에 대한 심볼릭 링크를 만드는 것이 좋습니다 /dev/null.
스튜어트 Cardall

1
@GabrielDevillers의 의견과 관련하여 시작 부분에 공백을 추가해도 항목이 항상 쉘 기록에서 숨겨지는 것은 아닙니다. 쉘과 설정에 따라 다릅니다.
tremby
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.