mysql과 같은 방식으로 비밀번호 암호화


15

사용자를 만들었지 만 비밀번호를 잊었습니다

mysql> 'right'로 식별되는 사용자 'blayo'@ '%'를 작성하십시오.

어떤 리눅스 커맨드 라인 툴이 mysql 5.5와 같은 방식으로 패스워드를 암호화 할 수 있습니까?

mysql> mysql.user에서 Password, User를 선택하십시오.
------------------------------------------ + ------- +
* 920018161824B14A1067A69626595E68CB8284CB | blayo |

... 올바른 것을 사용하도록

$ 도구 권리
* 920018161824B14A1067A69626595E68CB8284CB

2
왜 관리자로 로그인하여 새 비밀번호를 정의 할 수 blayo없습니까? 그것은 올바른 문자를 찾기 위해 수조 개의 가능한 문자 조합을 실행하는 것보다 확실히 빠릅니다.
nohillside

답변:


13

글쎄, 사소한 (아마도 부정 행위 ) 방법은 다음과 같습니다.

mysql -NBe "select password('right')"

이것은 mysql 버전이 사용하는 암호 해싱 구성표를 사용하여 암호를 생성합니다. [ 편집 : -NB를 추가하여 열 이름과 ASCII 테이블 아트를 제거합니다.]


6
그리고 편리하게 MySQL 로그와 bash 계정 내역 로그에 반짝이는 새 암호를 일반 텍스트로 저장합니다.
Craig

@Craig 둘 다를 막기 위해 mysqlbash 기록에서 숨기려면 바로 앞에 ''(공백)을 붙여서 MySQL 로그에서 숨기려면 SET sql_log_off=ON;바로 앞에 사용할 수 있습니다 SELECT ....
Murmel

1
@Murmel 업데이트에 감사드립니다! 물론 암호를 기록하지 않는 것이 기본값입니다. 보안은 항상 기본 설정이어야합니다.
Craig

공정 되려면 @Craig이 이미 (이 기능이 존재하는 마지막 버전이 제거되었다 5.7 V mysql을하면됩니다 v8.0.11 에 영향을 미치는 1. 클라이언트 측 (다음에)) .mysql_history일치하는 모든 문 무시) *PASSWORD*와 2. 서버 측을 여러 stmt (제외 SELECT). 참조 : MySQL 5.7 매뉴얼-비밀번호 및 로깅MySQL
5.7-

좋은 피드백입니다! 불행히도 다양한 이유로 (자체 포함) 여전히 5.7 이전의 mysql 버전을 사용하는 사람들이 여전히 있습니다.
Craig

12

일부 라이너 :

MySQL (-u (user) -p를 추가해야 할 수도 있음) :

mysql -NBe "select password('right')"

파이썬 :

python -c 'from hashlib import sha1; print "*" + sha1(sha1("right").digest()).hexdigest().upper()'

:

perl -MDigest::SHA1=sha1_hex -MDigest::SHA1=sha1 -le 'print "*". uc sha1_hex(sha1("right"))'

PHP :

php -r 'echo "*" . strtoupper(sha1(sha1("right", TRUE))). "\n";'

루비 :

ruby -e 'require "digest/sha1"; puts "*" + Digest::SHA1.hexdigest(Digest::SHA1.digest("right")).upcase'

모든 출력 :

* 920018161824B14A1067A69626595E68CB8284CB



@alexjhart 새로운 mysql 5.7.8 비밀번호 해싱 알고리즘에 대한 업데이트를받을 수 있습니까? (어떻게 이것을 발견했는지에 대해 조금 자세히 설명하겠습니까?)
ThorSummoner

6

MySQL이 명령 줄과 로그에서 암호를 난독 화하지 않는다는 것이 여전히 마음에 듭니다. 그리고 이것이 @Gilles 답변에 댓글을 달기보다는 답변을 추가하는 유일한 이유입니다.

그래서, 물론, 당신은 할 수 단지 관리자로 MySQL에 로그인 @patrix 제안으로, 당신의 blayo 사용자에 대한 새 암호를 설정합니다.

그러나 일반적인 방법은 일반 텍스트 비밀번호를 인수로 사용하는 MySQL의 password () 함수를 사용하는 것입니다.

그렇게하면, MySQL 사용자 암호의 일반 텍스트 버전을 bash 기록과 MySQL 로그에 그대로 두어 나중에 해당 로그 파일에 액세스 할 수있는 사람이 쉽게 검색 할 수 있습니다.

암호를 화면이나 로그에 표시하지 않고 암호를 묻는 작은 유틸리티를 사용하여 MySQL 호환 해시를 제공하는 것이 낫지 않습니까?

따라서 @Gilles의 대답을 약간 수정하면 다음과 같이 Python을 사용하는 작은 쉘 스크립트는 어떻습니까? MySQL 데이터베이스에 대해 SQL 문을 실행하여 암호를 한 번에 설정하도록 쉽게 수정할 수 있습니다. 그러나 멀리 가지 않아도 결과 해시를 복사하여 SQL 문에 붙여 넣어 users 테이블을 업데이트하십시오.

#!/bin/bash

mysqlpwd=$(/usr/bin/python -c 'from hashlib import sha1; import getpass; print "*" + sha1(sha1(getpass.getpass("New MySQL Password:")).digest()).hexdigest()')

echo $mysqlpwd

@HalosGhost; 무엇을 편집 했습니까? 아무것도 바뀌지 않았습니까? ;-)
Craig

편집 요약에 표시된대로 구문 강조를 시행하고 실제 편집 텍스트를 통해 명확하게 표시했습니다.
HalosGhost

3
아, 그래 솔직히 당신이 한 일을 몰랐습니다 (당신은 분명히 <!-- language: lang-bsh -->선을 추가했습니다 ). 능숙한! 나는 그것을 좋아한다. 감사!
Craig

5

쉘을 사용하여 한 번 더 :

echo -n 'right' | sha1sum | xxd -r -p |\
sha1sum | tr '[a-z]' '[A-Z]' | awk '{printf "*%s", $1}'

설명:

  1. echo -n 줄 바꿈없이 인쇄
  2. sha1sum 첫 SHA1
  3. xxd -r -p 해시를 풀다
  4. sha1sum 두 번째 SHA1
  5. tr '[a-z]' '[A-Z]' 대문자로 변환
  6. awk '{print "*" $1}' 선행 추가 *

자세한 내용은:

2 줄과 3 줄 사이 awk '{printf "%s", $1}'에 줄 바꿈과 하이픈 제거를위한 선택적 단계가 포함될 수 있습니다. 그러나 xxd는 어쨌든 무시합니다 (dave_thompson_085에게 감사합니다).

또한 5 단계와 6 단계를 {print "*" toupper($1)}(dave_thompson_085에게 감사)로 대체하여 한 번에 수행 할 수 있습니다 .


1
awk대문자를 수행 할 수 있으며 불완전한 (마지막) 줄을 터미널에 출력하는 것은 불편 .. | sha1sum | awk '{print "*" toupper($1)}'합니다. 그리고 NL에 대해 걱정할 필요가 없으며의 하이픈조차도 xxd -r -p무시됩니다.
dave_thompson_085

4

해시는 sha1 (sha1 (password)) 입니다. 소금 (심각한 보안 결함) 이 없기 때문에 테이블에서 해시를 찾을 수 있습니다 .

sha1sumGNU coreutils 또는 BusyBox의 POSIX 도구와 함께 , sha1 (sha1 (password)) sha1sum명령은 16 진수로 다이제스트를 인쇄하고 바이너리로 변환하는 표준 도구가 없기 때문에 계산하기가 성가시다 .

awk "$(printf %s 'right' | sha1sum |
       sed -e 's/ .*//' -e 's/../, 0x&/g' \
           -e 's/^/BEGIN {printf "%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c"/' \
           -e 's/$/; exit}/')" | sha1sum

파이썬은 표준 라이브러리에 표준 다이제스트를 가지고 있으므로 간단한 단일 라이너입니다.

printf %s 'right' |
python -c 'from hashlib import sha1; import sys; print sha1(sha1(sys.stdin.read()).digest()).hexdigest()'

또는 one-liner 내부의 비밀번호를 사용하여 :

python -c 'from hashlib import sha1; print sha1(sha1("right").digest()).hexdigest()'

나는이 대답을 정신적으로 좋아하지만 제대로 작동하지 않습니다. Enter 키를 눌렀을 때 계속 움직이지 않고 입력을 계속 읽고 싶습니다. 또한 입력이 화면으로 다시 에코되므로 바람직하지 않습니다. 그래도 어떻습니까? unix.stackexchange.com/a/155583/37401
Craig

@Craig 대화 형 입력을 읽는 방법은 질문의 범위를 벗어납니다. 스크립트에 이미 암호가 있다고 가정합니다. 일반적으로 파일에 저장되므로 대화 형으로 데이터베이스 암호를 입력하는 경우는 거의 없습니다. 대화식 입력을 읽으려면 read쉘 내장을 사용하여 행을 읽을 수 있습니다. stty echo에코 ssty +echo를 끄고 다시 켜 려면 먼저 실행하십시오 . 파이썬에서는 getpass모듈을 사용할 수 있습니다 .
Gilles 'SO- 악마 그만'

그래, 알아 .. 그리고 충분히 공평 해! 나는가는 길 아래에서 끔찍한 보안을 싫어하고, MySQL 보안은 일반적으로 끔찍하기 때문에 기회가 생길 때마다 약간의 보안 통찰력을 주입하려는이 무질서한 경향이 있습니다. ;-)
Craig

1

사용자를 분류하고 암호를 잊어 버린 경우이 작업을 수행해야하며 더 쉽습니다.

한 번에 100 억 건의 작업을 수행하는 동안이 작업도 수십 번 발생했습니다. 비밀번호를 복구하는 가장 좋은 방법은 다음과 같습니다.

먼저 mysql 서버를 완전히 중지

mysqld_safe --skip-grant-tables 발행 및

그런 다음 비밀번호를 발급하지 않고 루트로 로그인했습니다. mysql -u mysql-user (mysqld_safe 이후에 로그인 할 수 있습니다)

그런 다음 mysql> user 테이블로 이동하여 사용자의 비밀번호를 업데이트하십시오.

그런 다음 돌아가서 mysql을 다시 시작하십시오.

그것이 작동하는지 알려 우리에게 알려주십시오.


당신이 로그인 할 수있는 더 많은 경우에 대한 것처럼이 보인다 전혀 하지 않고 단지 특정 사용자로보다.
mwfearnley

1

쉘을 사용하는 다른

echo -n 'right' | openssl sha1 -binary | openssl sha1 -hex | \
    awk '{print "*"toupper($0)}'

... 출력 :

*920018161824B14A1067A69626595E68CB8284CB

0

MySQL 4.1 이상에서는 이중 SHA1 사용

> SELECT PASSWORD("right")
*920018161824B14A1067A69626595E68CB8284CB

> SELECT SHA1(UNHEX(SHA1("right")))
920018161824B14A1067A69626595E68CB8284CB

sh-3.2# php -r 'echo "*" . sha1(sha1("right", TRUE)). "\n";'
*920018161824b14a1067a69626595e68cb8284cb

이 알고리즘은 다른 언어로 쉽게 이식 될 수 있습니다. "비밀번호 선택"의 비밀번호 해시는 항상 "*"문자로 시작한다는 점이 다릅니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.