Bir şifreyi mysql ile aynı şekilde şifreleyin


16

Bir kullanıcı oluşturdum ... ama şifremi unuttum

mysql> 'doğru' ile tanımlanan 'blayo' @ '%' kullanıcısı oluştur;

Hangi Linux komut satırı aracı mysql 5.5 ile aynı şifreyi şifreleyebilir?

mysql> mysql.user'dan Parola, Kullanıcı'yı seçin
------------------------------------------ + ------- +
* 920018161824B14A1067A69626595E68CB8284CB | blayo |

... doğru olanı kullandığımdan emin olmak için

$ tool right
* 920018161824B14A1067A69626595E68CB8284CB

2
Neden sadece yönetici olarak oturum açıp yeni bir şifre tanımlayamıyorsunuz blayo? Bu, doğru olanı bulmak için trilyonlarca olası karakter kombinasyonundan geçmekten kesinlikle daha hızlı.
nohillside

Yanıtlar:


13

Önemsiz (belki de hile ) yol çalıştırmak olacaktır:

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

Bu, mysql sürümünüzün kullandığı şifre karma düzenini kullanarak bir şifre üretecektir. [ EDIT : sütun isimleri ve ascii tablo resimlerinden kurtulan -NB eklendi.]


6
Ve kolayca, bu yeni parlak parolanızı hem MySQL günlüğünüzde hem de bash hesap geçmişi günlüğünüzde açık metin olarak saklar.
Craig

@Craig Her ikisini de önlemek mysqliçin, bash geçmişinden gizlemek için hemen önce bir '' (boşluk) başlatabilir ve MySQL günlüğünden gizlemek için SET sql_log_off=ON;hemen önce kullanabilirsiniz SELECT ....
Murmel

1
@Murmel güncelleme için teşekkürler! Elbette, varsayılan olarak şifrelerin kaydedilmemesi gerekir. Güvenlik her zaman varsayılan ayar olmalıdır.
Craig

Fuara olmak @Craig, bu zaten (bu fonksiyon mevcut son sürümü ile temizlenebilir var v5.7 mysql yapılır v8.0.11 etkileyen 1. clientside (: on)) .mysql_historyeşleşen tüm ifadeleri görmezden) *PASSWORD*ve 2. serverside birkaç stmts (hariç SELECT). Bkz: MySQL 5.7 El Kitabı - Parolalar ve Günlüğe Kaydetme ve MySQL 5.7 - El Kitabı - mysql İstemci Günlüğü
Murmel

Bu iyi bir geri bildirim! Ne yazık ki, hala çeşitli nedenlerden dolayı (ben dahil) hala 5.7'den daha eski mysql sürümlerini kullanarak sıkışmış birkaç kişi var.
Craig

12

Bazı tek gömlekler:

MySQL (-u (kullanıcı) -p eklemenizi gerektirebilir):

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üm çıktılar:

* 920018161824B14A1067A69626595E68CB8284CB



@alexjhart Yeni mysql 5.7.8 şifre karma algoritması için güncelleme alabilir miyim? (belki de bunu nasıl bulduğuna dair biraz ayrıntı?)
ThorSummoner

6

MySQL'in komut satırında ve günlüklerde gizleyici parolaları rahatsız etmemesi hala aklımdan geçiyor. Ve sadece @Gilles cevabına yorum yapmak yerine bir cevap eklememin tek nedeni bu.

Elbette, MySQL'e yönetici olarak giriş yapabilir ve @ patrix'in önerdiği gibi blayo kullanıcınız için yeni bir şifre ayarlayabilirsiniz.

Bununla birlikte, bunu yapmanın standart yolu, düz metin parolayı bağımsız değişken olarak alan (ciddi mi?) MySQL'in password () işlevini kullanmaktır.

Bunu yaparsanız, MySQL kullanıcı parolanızın düz metin sürümünü bash geçmişinizde ve MySQL günlüklerinizde oturarak daha sonra bu günlük dosyalarına erişmeyi başaran herkes tarafından kolayca alınmasını sağlarsınız.

Ekrana veya günlüklerinize yansımadan, parolayı soracak küçük bir yardımcı programa sahip olmak daha iyi olmaz mı, daha sonra size MySQL uyumlu karma sağlayın?

Yani, @ Gilles'in cevabını biraz değiştirmek, aşağıdaki gibi Python kullanan küçük bir kabuk komut dosyasına ne dersiniz. Parolayı bir kerede ayarlamak için MySQL veritabanınıza karşı bir SQL ifadesi çalıştırmak üzere bunu kolayca değiştirebilirsiniz. Ancak bu kadar ileri gitmeden bile, kullanıcı tablosunu güncellemek için sonuçtaki karmayı kopyalayıp bir SQL ifadesine yapıştırın:

#!/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; düzenleme neyle ilgiliydi? Hiçbir şey değişmedi mi? ;-)
Craig

Sözdizimi vurgulamayı zorunlu kıldı (düzenleme özetinde belirtildiği gibi) ve düzenlemenin gerçek metni tarafından açıkça belirtildi.
HalosGhost

3
Ah Bu yüzden. Dürüst olmak gerekirse ne yaptığınızı fark etmediniz (açık bir şekilde <!-- language: lang-bsh -->satırı eklediniz ). Kullanışlı! Bunu sevdim. Teşekkürler!
Craig

5

Kabuğu kullanarak bir tane daha:

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

Açıklama:

  1. echo -n çizgisiz baskı
  2. sha1sum ilk SHA1
  3. xxd -r -p karma unhex
  4. sha1sum ikinci SHA1
  5. tr '[a-z]' '[A-Z]' büyük harfe dönüştür
  6. awk '{print "*" $1}' lider ekle *

Daha fazla detay:

2. ve 3. arasında awk '{printf "%s", $1}', yeni satır ve kısa çizgi kaldırma için isteğe bağlı bir adım yerleştirilebilir. Ama xxd zaten onları görmezden gelecek (dave_thompson_085 sayesinde).

Ayrıca, adım 5 ve 6 bunların yerine bir kerede yapılabilir {print "*" toupper($1)}(dave_thompson_085 sayesinde).


1
awkbüyük harf yapmak ve terminale bir tam olmayan (son) hat çıkış incovenient olan olabilir: .. | sha1sum | awk '{print "*" toupper($1)}'. Ve NL ve hatta tire işareti hakkında endişelenmenize gerek xxd -r -pyok, yok sayılırlar.
dave_thompson_085

4

Karma sha1'dir (sha1 (şifre)) . Tuz olmadığından (ciddi bir güvenlik açığıdır), hash'ı bir tabloda görebilirsiniz .

Sadece POSIX araçları artı sha1sumGNU coreutils veya BusyBox ile, sha1 (sha1 (şifre)) hesaplamak can sıkıcıdır çünkü sha1sumkomut özeti onaltılık olarak yazdırır ve ikiliye dönüştürmek için standart bir araç yoktur.

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, standart kütüphanelerinde standart özetlere sahiptir, bu yüzden basit bir astardır.

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

Veya tek astarın içindeki şifre ile:

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

Bu cevabı ruh olarak seviyorum, ama pek işe yaramıyor. Enter tuşuna bastığımda, devam etmek yerine girişi okumaya devam etmek istiyor. Ayrıca, giriş arzu edilmeyebilecek ekrana geri döner. Buna benzer bir şeye ne dersin? unix.stackexchange.com/a/155583/37401
Craig

@Craig Etkileşimli girdinin nasıl okunacağı sorunun kapsamının ötesindedir. Betiğin zaten parolaya sahip olduğunu varsayıyorum; genellikle bir dosyada saklanır, bir veritabanı parolasını etkileşimli olarak yazmak nadirdir. Etkileşimli girişi okumak isterseniz, readbir satır okumak için kabuk yerleşimini kullanabilirsiniz; çalıştırmak stty echoEğer yankı kapatmak ve isterseniz ilk ssty +echotekrar açmak için. Python'da getpassmodülü kullanabilirsiniz .
Gilles 'SO- kötü olmayı bırak'

Evet, biliyorum ... ve yeterince adil! Gittiğim yolda daha fazla korkunç güvenlikten nefret ediyorum ve MySQL güvenliği genel olarak oldukça korkunç, bu yüzden şansımın olduğu her yere biraz güvenlik içgörü enjekte etmek için bu diz sarsıntı eğilimi var. ;-)
Craig

1

Bir kullanıcıyı sandıkladıysanız ve şifreyi unuttuysanız, yapmanız gereken budur ve daha kolaydır.

Bir kerede 10 milyar şey yaparken bu bana bir düzine kez oldu. Şifremi kurtarmamın en iyi yolu şuydu:

ilk önce mysql sunucusunu durdurdu

yayınlanmış mysqld_safe --skip-grant-tables &

sonra bir şifre vermeden kök olarak giriş yaptım, sadece mysql -u mysql-kullanıcı (mysqld_safe sonra size izin verir)

ardından mysql> kullanıcı tablosuna gidin ve kullanıcı için parolayı güncelleyin

sonra geri dönün ve mysql'yi yeniden başlatın

işe yarayıp yaramadığını görün ve bize bildirin.


Eğer giriş yapamıyorsanız o daha dava için olacak gibi görünüyor hiç yerine sadece belirli bir kullanıcı olarak değil,.
mwfearnley

1

Başka bir kabuk kullanarak

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

... çıktıları:

*920018161824B14A1067A69626595E68CB8284CB

0

MySQL 4.1+, çift SHA1 kullanır

> SELECT PASSWORD("right")
*920018161824B14A1067A69626595E68CB8284CB

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

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

Bu algoritma diğer dillere kolayca taşınabilir. Fark, "şifre seç" deki parola karmasının her zaman "*" karakteriyle başlamasıdır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.