Mã hóa mật khẩu giống như cách mysql thực hiện


15

Tôi đã tạo một người dùng ... nhưng quên mật khẩu

mysql tạo người dùng 'blayo' @ '%' được xác định bởi 'right';

Công cụ dòng lệnh Linux nào có thể mã hóa mật khẩu giống như cách mysql 5.5 thực hiện?

mysql chọn Mật khẩu, Người dùng từ mysql.user
------------------------------------------ + ------- +
* 920018161824B14A1067A69626595E68CB8284CB | blay |

... để chắc chắn rằng tôi sử dụng đúng

$ công cụ phải
* 920018161824B14A1067A69626595E68CB8284CB

2
Tại sao bạn không thể đăng nhập với tư cách quản trị viên và xác định mật khẩu mới blayo? Điều đó chắc chắn nhanh hơn so với việc chạy qua hàng nghìn tỷ kết hợp nhân vật có thể để tìm đúng.
nohillside

Vui lòng không đăng cùng một câu hỏi lên nhiều trang web Stack Exchange . Phiên bản DBA cũng đã được trả lời, đó là một sự lãng phí nỗ lực.
Gilles 'SO- ngừng trở nên xấu xa'

Câu trả lời:


13

Chà, cách tầm thường (có lẽ là gian lận ) sẽ là chạy:

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

Điều này sẽ tạo ra một mật khẩu bằng cách sử dụng bất kỳ lược đồ băm mật khẩu nào mà phiên bản mysql của bạn sử dụng. [ EDIT : đã thêm -NB, loại bỏ tên cột và bảng nghệ thuật ascii.]


6
Và, thật khéo léo, điều này sẽ lưu trữ mật khẩu mới sáng bóng của bạn dưới dạng văn bản rõ ràng cả trong nhật ký MySQL và nhật ký lịch sử tài khoản bash của bạn.
Craig

@Craig Để ngăn chặn cả hai bạn có thể trả trước '' (dấu cách) ngay trước khi mysqlẩn nó khỏi lịch sử bash và bạn có thể sử dụng SET sql_log_off=ON;ngay trước khi SELECT ...ẩn nó khỏi nhật ký MySQL.
Murmel

1
@Murmel cảm ơn đã cập nhật! Tất nhiên, nó nên mặc định để không đăng nhập mật khẩu. Bảo mật phải luôn là cài đặt mặc định.
Craig

@Craig Công bằng mà nói, điều này đã được thực hiện bởi mysql (v5.7, phiên bản cuối cùng mà chức năng này tồn tại, đã bị xóa với v8.0.11 )) trên: 1. clientide (ảnh hưởng .mysql_history) bỏ qua tất cả các câu lệnh khớp *PASSWORD*và 2. serveride cho vài stmts (trừ SELECT). Xem: Hướng dẫn sử dụng MySQL 5.7 - Mật khẩu và ghi nhật kýMySQL 5.7 - Hướng dẫn - Ghi nhật ký máy khách mysql
Murmel

Đó là phản hồi tốt! Thật không may, vẫn còn khá nhiều người vì nhiều lý do (bao gồm cả bản thân tôi) vẫn bị mắc kẹt khi sử dụng các phiên bản mysql cũ hơn 5.7.
Craig

12

Một số lót:

MySQL (có thể yêu cầu bạn thêm -u (người dùng) -p):

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

Python :

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

Perl :

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 :

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

Tất cả đầu ra:

* 920018161824B14A1067A69626595E68CB8284CB


Cảm ơn, tôi đã liên kết với câu trả lời của bạn trong serverfault.com/a/846281/236916
mwfearnley

@alexjhart Tôi có thể nhận được bản cập nhật cho thuật toán băm mật khẩu mysql 5.7.8 mới không :)? (có thể là một chi tiết nhỏ về cách bạn cũng phát hiện ra điều này?)
ThorSummoner

6

Tôi vẫn cho rằng MySQL không bận tâm đến việc làm xáo trộn mật khẩu trên dòng lệnh và trong nhật ký. Và đó là lý do duy nhất tôi thêm câu trả lời thay vì chỉ nhận xét về câu trả lời @Gilles.

Vì vậy, tất nhiên, bạn có thể chỉ đăng nhập vào MySQL với tư cách quản trị viên và đặt mật khẩu mới cho người dùng blayo của bạn, như @patrix đề xuất.

Tuy nhiên, cách tiêu chuẩn để thực hiện điều đó là sử dụng hàm password () của MySQL, lấy mật khẩu văn bản gốc làm đối số (nghiêm túc?).

Nếu bạn làm điều đó, bạn để lại phiên bản gốc của mật khẩu người dùng MySQL của bạn trong lịch sử bash và trong nhật ký MySQL của bạn, để dễ dàng truy xuất sau này bởi bất cứ ai quản lý để có quyền truy cập vào các tệp nhật ký đó.

Sẽ không tốt hơn nếu có một tiện ích nhỏ sẽ nhắc mật khẩu, mà không lặp lại nó trên màn hình hoặc vào nhật ký của bạn, sau đó cung cấp cho bạn hàm băm tương thích với MySQL?

Vì vậy, sửa đổi câu trả lời của @ Gilles chỉ một chút, làm thế nào về một tập lệnh shell nhỏ sử dụng Python, như sau. Bạn có thể dễ dàng sửa đổi điều này để chạy một câu lệnh SQL dựa trên cơ sở dữ liệu MySQL của bạn để đặt mật khẩu cùng một lúc. Nhưng ngay cả khi không đi xa đến thế, chỉ cần sao chép và dán băm kết quả vào câu lệnh SQL để cập nhật bảng người dùng:

#!/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; chỉnh sửa về cái gì? Nó chẳng thay đổi gì cả? ;-)
Craig

Nó thực thi tô sáng cú pháp (như đã lưu ý trong bản tóm tắt chỉnh sửa) và được làm rõ bằng văn bản thực tế của bản chỉnh sửa.
HalosGhost

3
À, vậy. Thành thật không nhận ra những gì bạn đã làm (rõ ràng bạn đã thêm <!-- language: lang-bsh -->dòng). Tiện dụng! Tôi thích nó. Cảm ơn!
Craig

5

Thêm một cái nữa bằng cách sử dụng shell:

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

Giải trình:

  1. echo -n in mà không ngắt dòng
  2. sha1sum SHA1 đầu tiên
  3. xxd -r -p bỏ băm
  4. sha1sum SHA1 thứ hai
  5. tr '[a-z]' '[A-Z]' chuyển thành chữ hoa
  6. awk '{print "*" $1}' thêm hàng đầu *

Thêm chi tiết:

Từ 2. đến 3. một tùy chọn awk '{printf "%s", $1}' bước có thể được đưa ra để loại bỏ dòng mới và gạch nối. Nhưng xxd sẽ bỏ qua chúng bằng mọi cách (Cảm ơn dave_thedom_085).

Hơn nữa, bước 5 và 6 có thể được thực hiện cùng một lúc bằng cách thay thế chúng bằng {print "*" toupper($1)}(Cảm ơn dave_thedom_085).


1
awkcó thể viết hoa và xuất ra một dòng không hoàn chỉnh (cuối cùng) cho thiết bị đầu cuối là không cần thiết : .. | sha1sum | awk '{print "*" toupper($1)}'. Và bạn không cần phải lo lắng về NL và thậm chí cả dấu gạch nối trên xxd -r -p, chúng bị bỏ qua.
dave_thndry_085

4

Băm là sha1 (sha1 (mật khẩu)) . Vì không có muối (là một lỗ hổng bảo mật nghiêm trọng), bạn có thể tra cứu hàm băm trong bảng .

Chỉ với các công cụ POSIX cộng với sha1sumtừ GNU coreutils hoặc BusyBox, sha1 (sha1 (mật khẩu)) rất khó tính vì sha1sumlệnh này in ra bản tóm tắt dưới dạng thập lục phân và không có công cụ tiêu chuẩn nào để chuyển đổi thành nhị phân.

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

Python có các bản tóm tắt tiêu chuẩn trong các thư viện tiêu chuẩn của nó, vì vậy nó là một phần mềm đơn giản.

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

Hoặc với mật khẩu bên trong một lớp lót:

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

Tôi thích câu trả lời này trong tinh thần, nhưng nó không hoạt động. Khi tôi nhấn phím enter, nó vẫn muốn tiếp tục đọc đầu vào thay vì tiếp tục. Ngoài ra, tiếng vang đầu vào trở lại màn hình, có thể không được mong muốn. Làm thế nào về một cái gì đó như thế này, mặc dù? unix.stackexchange.com/a/155583/37401
Craig

@Craig Làm thế nào để đọc đầu vào tương tác nằm ngoài phạm vi của câu hỏi. Tôi giả sử rằng tập lệnh đã có mật khẩu; thông thường nó được lưu trữ trong một tệp, rất hiếm khi nhập mật khẩu cơ sở dữ liệu một cách tương tác. Nếu bạn muốn đọc đầu vào tương tác, bạn có thể sử dụng hàm readdựng sẵn để đọc một dòng; chạy stty echotrước nếu bạn muốn tắt tiếng vang và ssty +echobật lại. Trong Python, bạn có thể sử dụng getpassmô-đun.
Gilles 'SO- ngừng trở nên xấu xa'

Vâng, tôi biết ... và đủ công bằng! Tôi chỉ ghét sự bảo mật khủng khiếp khi đi xa hơn và nói chung, bảo mật của MySQL khá kinh khủng, vì vậy tôi có xu hướng giật đầu gối này muốn đưa ra một cái nhìn sâu sắc về bảo mật bất cứ khi nào tôi có cơ hội. ;-)
Craig

1

Nếu bạn chọn một người dùng và quên mật khẩu thì đây là việc bạn nên làm và dễ dàng hơn.

Điều này cũng xảy ra với tôi cả chục lần trong khi tôi đang làm 10 tỷ việc một lúc. Cách tốt nhất mà tôi đã khôi phục mật khẩu của mình là:

dừng hoàn toàn máy chủ mysql trước

đã ban hành mysqld_safe --skip-Grant-bảng &

sau đó tôi đăng nhập bằng root mà không cần cấp mật khẩu, chỉ cần mysql -u mysql-user (nó cho phép bạn đăng nhập sau mysqld_safe)

sau đó vào bảng người dùng mysql và cập nhật mật khẩu cho người dùng

sau đó quay trở lại và khởi động lại mysql

xem nếu nó hoạt động và cho chúng tôi biết.


Điều này có vẻ như nó sẽ được nhiều hơn cho các trường hợp mà bạn không thể đăng nhập ở tất cả , chứ không phải chỉ như một người dùng cụ thể.
mwfearnley

1

Một cái khác sử dụng vỏ

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

... mà kết quả đầu ra:

*920018161824B14A1067A69626595E68CB8284CB

0

MySQL 4.1+ sử dụng gấp đôi SHA1

> SELECT PASSWORD("right")
*920018161824B14A1067A69626595E68CB8284CB

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

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

Thuật toán này có thể dễ dàng chuyển sang các ngôn ngữ khác. Một điểm khác biệt là băm mật khẩu trong "chọn mật khẩu" luôn bắt đầu bằng ký tự * *.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.