명령 줄에서 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.