Enkripsi kata sandi dengan cara yang sama dengan mysql

15

Saya telah membuat pengguna ... tetapi lupa kata sandinya

mysql> buat pengguna 'blayo' @ '%' diidentifikasi oleh 'benar';

Alat baris perintah Linux mana yang dapat mengenkripsi kata sandi dengan cara yang sama dengan yang dilakukan mysql 5.5?

mysql> pilih Kata Sandi, Pengguna dari mysql.user
------------------------------------------ + ------- +
* 920018161824B14A1067A69626595E68CB8284CB | blayo |

... untuk memastikan saya menggunakan yang benar

$ tool benar
* 920018161824B14A1067A69626595E68CB8284CB
Philippe Blayo
sumber
2
Mengapa Anda tidak bisa masuk begitu saja sebagai administrator dan menentukan kata sandi baru untuk blayo? Itu pasti lebih cepat daripada menjalankan triliunan kombinasi karakter yang mungkin untuk menemukan yang tepat.
nohillside
Tolong jangan memposting pertanyaan yang sama ke beberapa situs Stack Exchange . Versi DBA telah dijawab juga, yang merupakan usaha sia-sia.
Gilles 'SO- stop being evil'

Jawaban:

13

Nah, cara sepele (mungkin curang ) adalah dengan menjalankan:

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

Ini akan menghasilkan kata sandi menggunakan skema hashing kata sandi apa pun yang digunakan versi mysql Anda. [ EDIT : menambahkan -NB, yang menghilangkan nama kolom dan ascii table art.]

jsbillings
sumber
6
Dan, dengan mudah, ini akan menyimpan kata sandi baru Anda yang mengkilap dalam teks yang jelas baik di log MySQL Anda dan di log riwayat akun bash Anda.
Craig
@Craig Untuk mencegah keduanya, Anda dapat menambahkan '(spasi) tepat sebelum mysqluntuk menyembunyikannya dari bash history dan Anda dapat menggunakan SET sql_log_off=ON;tepat sebelum SELECT ...untuk menyembunyikannya dari log MySQL.
Murmel
1
@Murmel, terima kasih atas pembaruannya! Tentu saja, seharusnya default untuk tidak mencatat kata sandi. Keamanan harus selalu menjadi pengaturan default.
Craig
@Craig Agar adil, ini sudah dilakukan oleh mysql (v5.7, versi terakhir fungsi ini ada, dihapus dengan v8.0.11 )) pada: 1. clientside (mempengaruhi .mysql_history) mengabaikan semua pernyataan yang cocok *PASSWORD*dan 2. serveride untuk beberapa stmts (kecuali SELECT). Lihat: MySQL 5.7 Manual - Kata Sandi dan Logging dan MySQL 5.7 - Manual - mysql Client Logging
Murmel
Itu umpan balik yang bagus! Sayangnya, masih ada beberapa orang yang karena berbagai alasan (termasuk saya) masih terjebak menggunakan versi mysql lebih tua dari 5.7.
Craig
12

Beberapa kalimat:

MySQL (mungkin mengharuskan Anda menambahkan -u (pengguna) -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'

Semua output:

* 920018161824B14A1067A69626595E68CB8284CB

alexjhart
sumber
Terima kasih, saya menautkan jawaban Anda di serverfault.com/a/846281/236916
mwfearnley
@alexjhart Bisakah saya mendapatkan pembaruan untuk algoritma hashing password mysql 5.7.8 baru :)? (mungkin sedikit detail tentang bagaimana Anda menemukan ini juga?)
ThorSummoner
6

Itu masih semacam pukulan pikiran saya bahwa MySQL tidak mengganggu mengaburkan kata sandi pada baris perintah dan dalam log. Dan itulah satu-satunya alasan saya menambahkan jawaban daripada hanya mengomentari jawaban @Gilles.

Jadi, tentu saja, Anda bisa masuk ke MySQL sebagai admin dan menetapkan kata sandi baru untuk pengguna blayo Anda, seperti yang disarankan @patrix.

Namun, cara standar untuk melakukannya adalah dengan menggunakan fungsi kata sandi MySQL (), yang menggunakan kata sandi plaintext sebagai argumen (serius?).

Jika Anda melakukannya, Anda meninggalkan versi plaintext dari kata sandi pengguna MySQL Anda duduk-duduk di bash history Anda dan di log MySQL Anda, untuk pengambilan yang mudah nanti oleh siapa pun yang mengelola untuk mendapatkan akses ke file log tersebut.

Bukankah lebih baik memiliki sedikit utilitas yang akan meminta kata sandi, tanpa menggema ke layar atau ke log Anda, lalu memberi Anda hash yang dihasilkan MySQL yang kompatibel?

Jadi, memodifikasi jawaban @ Gilles hanya sedikit, bagaimana dengan skrip shell kecil yang menggunakan Python, seperti berikut ini. Anda dapat dengan mudah memodifikasi ini untuk menjalankan pernyataan SQL terhadap database MySQL Anda untuk mengatur kata sandi sekaligus. Tetapi bahkan tanpa melangkah sejauh itu, cukup salin dan tempel hash yang dihasilkan ke dalam pernyataan SQL untuk memperbarui tabel pengguna:

#!/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
Craig
sumber
@HalosGhost; tentang apa hasil edit? Itu tidak mengubah apa pun? ;-)
Craig
Itu diberlakukan penyorotan sintaks (seperti dicatat dalam ringkasan edit) dan dibuat jelas oleh teks yang sebenarnya dari edit.
HalosGhost
3
Ah, jadi. Jujur tidak menyadari apa yang telah Anda lakukan (Anda jelas menambahkan <!-- language: lang-bsh -->baris). Berguna! Saya suka itu. Terima kasih!
Craig
5

Satu lagi menggunakan shell:

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

Penjelasan:

  1. echo -n mencetak tanpa linebreak
  2. sha1sum SHA1 pertama
  3. xxd -r -p unhex hash
  4. sha1sum SHA1 kedua
  5. tr '[a-z]' '[A-Z]' dikonversi ke huruf besar
  6. awk '{print "*" $1}' tambahkan terkemuka *

Keterangan lebih lanjut:

Antara 2. dan 3. awk '{printf "%s", $1}'langkah opsional bisa dilakukan untuk penghapusan baris baru dan tanda hubung. Tapi xxd akan mengabaikannya (Terima kasih kepada dave_thompson_085).

Selanjutnya langkah 5 dan 6 dapat dilakukan sekaligus dengan menggantinya dengan {print "*" toupper($1)}(Terima kasih kepada dave_thompson_085).

Murmel
sumber
1
awkdapat melakukan huruf besar, dan keluaran yang tidak lengkap (terakhir) baris ke terminal incovenient: .. | sha1sum | awk '{print "*" toupper($1)}'. Dan Anda tidak perlu khawatir tentang NL dan bahkan tanda hubung pada xxd -r -p, mereka diabaikan.
dave_thompson_085
4

Hash adalah sha1 (sha1 (kata sandi)) . Karena tidak ada garam (yang merupakan cacat keamanan kubur), Anda dapat melihat hash di dalam tabel .

Dengan hanya alat POSIX plus sha1sumdari GNU coreutils atau BusyBox, sha1 (sha1 (password)) menjengkelkan untuk dihitung karena sha1sumperintah mencetak ringkasan dalam heksadesimal dan tidak ada alat standar untuk mengkonversi ke biner.

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 memiliki intisari standar di pustaka standarnya, jadi ini adalah one-liner sederhana.

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

Atau dengan kata sandi di dalam liner:

python -c 'from hashlib import sha1; print sha1(sha1("right").digest()).hexdigest()'
Gilles 'SANGAT berhenti menjadi jahat'
sumber
Saya suka jawaban ini dalam roh, tetapi tidak cukup berhasil. Ketika saya menekan tombol enter, masih ingin terus membaca input alih-alih pindah. Juga, input bergema kembali ke layar, yang mungkin tidak diinginkan. Bagaimana dengan yang seperti ini? unix.stackexchange.com/a/155583/37401
Craig
@Craig Cara membaca input interaktif berada di luar jangkauan pertanyaan. Saya berasumsi bahwa skrip sudah memiliki kata sandi; biasanya disimpan dalam file, jarang mengetik kata sandi basis data secara interaktif. Jika Anda ingin membaca input interaktif, Anda dapat menggunakan readshell builtin untuk membaca baris; jalankan stty echodulu jika Anda ingin mematikan gema dan ssty +echomenyalakannya kembali. Dengan Python, Anda bisa menggunakan getpassmodul.
Gilles 'SO- stop being evil'
Ya, saya tahu ... dan cukup adil! Saya hanya membenci keamanan yang mengerikan semakin jauh saya pergi, dan keamanan MySQL secara umum cukup mengerikan, jadi saya memiliki kecenderungan yang tidak masuk akal untuk ingin menyuntikkan sedikit wawasan keamanan ke mana pun saya mendapatkan kesempatan. ;-)
Craig
1

Jika Anda membuat daftar pengguna dan lupa kata sandi, inilah yang harus Anda lakukan dan itu lebih mudah.

Ini juga terjadi pada saya belasan kali ketika saya melakukan 10 miliar hal sekaligus. Cara terbaik saya memulihkan kata sandi saya adalah:

menghentikan server mysql sepenuhnya terlebih dahulu

mengeluarkan mysqld_safe --skip-grant-tables &

kemudian saya login sebagai root tanpa mengeluarkan kata sandi, cukup mysql -u mysql-user (ini memungkinkan Anda masuk setelah mysqld_safe)

kemudian pergi ke tabel mysql> pengguna dan perbarui kata sandi untuk pengguna

kemudian kembali dan mulai ulang mysql

lihat apakah itu berhasil dan beri tahu kami.

unixmiah
sumber
Sepertinya ini lebih cocok jika Anda tidak bisa masuk sama sekali , bukan hanya sebagai pengguna tertentu.
mwfearnley
1

Lain menggunakan shell

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

... yang keluaran:

*920018161824B14A1067A69626595E68CB8284CB
Chris Martin
sumber
0

MySQL 4.1+ menggunakan SHA1 ganda

> SELECT PASSWORD("right")
*920018161824B14A1067A69626595E68CB8284CB

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

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

Algoritma ini dapat dengan mudah dipindahkan ke bahasa lain. Perbedaannya adalah bahwa kata sandi hash dalam "pilih kata sandi" selalu dimulai dengan karakter "*".

Diogo Nechtan
sumber