เข้ารหัสรหัสผ่านเช่นเดียวกับที่ mysql ทำ


15

ฉันได้สร้างผู้ใช้ ... แต่ลืมรหัสผ่าน

mysql> สร้างผู้ใช้ 'blayo' @ '%' ที่ระบุโดย 'right';

เครื่องมือบรรทัดคำสั่ง Linux ใดที่สามารถเข้ารหัสรหัสผ่านเช่นเดียวกับ mysql 5.5

mysql> เลือกรหัสผ่าน, ผู้ใช้จาก mysql.user
------------------------------------------ + ------- +
* 920018161824B14A1067A69626595E68CB8284CB | blayo |

... เพื่อให้แน่ใจว่าฉันใช้สิ่งที่ถูกต้อง

$ เครื่องมือที่เหมาะสม
* 920018161824B14A1067A69626595E68CB8284CB

2
ทำไมคุณไม่สามารถเพียงเข้าสู่ระบบในฐานะผู้ดูแลและกำหนดรหัสผ่านใหม่blayo? ซึ่งเร็วกว่าการใช้ชุดอักขระที่เป็นไปได้หลายล้านล้านชุดเพื่อค้นหาชุดที่ถูกต้อง
nohillside

กรุณาอย่าโพสต์คำถามเดียวกันไปยังเว็บไซต์กอง Exchange หลาย เวอร์ชั่น DBAก็ได้รับคำตอบเช่นกันซึ่งเป็นการสิ้นเปลืองความพยายาม
Gilles 'หยุดความชั่วร้าย'

คำตอบ:


13

เอ้อเล็กน้อย (บางทีการโกง ) จะทำงาน:

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

สิ่งนี้จะสร้างรหัสผ่านโดยใช้การแฮชรหัสผ่านอะไรก็ตามรุ่นของ mysql ที่คุณใช้ [ แก้ไข : เพิ่ม -NB ซึ่งกำจัดชื่อคอลัมน์และตาราง ASCII]


6
และสิ่งนี้จะเก็บรหัสผ่านใหม่ของคุณเป็นข้อความที่ชัดเจนทั้งในบันทึก MySQL ของคุณและในบันทึกประวัติบัญชี bash ของคุณ
Craig

@Craig เพื่อป้องกันทั้งสองคุณสามารถเพิ่ม '' (ช่องว่าง) ก่อนหน้าmysqlเพื่อซ่อนมันจากประวัติทุบตีและคุณสามารถใช้SET sql_log_off=ON;สิทธิ์ก่อนที่SELECT ...จะซ่อนมันจากบันทึก MySQL
Murmel

1
@Murmel ขอบคุณสำหรับการอัปเดต! นอกหลักสูตรควรตั้งค่าเริ่มต้นให้ไม่บันทึกรหัสผ่าน ความปลอดภัยควรเป็นการตั้งค่าเริ่มต้นเสมอ
Craig

@Craig เพื่อความเป็นธรรมนี้ได้ดำเนินการแล้วโดย mysql (v5.7, รุ่นล่าสุดของฟังก์ชั่นนี้มีอยู่ได้ถูกลบออกด้วยv8.0.11 )) ที่: 1. ไคลเอนต์ (ส่งผลกระทบ.mysql_history) ละเว้นการจับคู่คำสั่งทั้งหมด*PASSWORD*และ 2. เซิร์ฟเวอร์สำหรับ หลาย stmts (ยกเว้นSELECT) ดู: คู่มือ MySQL 5.7 - รหัสผ่านและการบันทึกและMySQL 5.7 - คู่มือ - การบันทึกไคลเอนต์ mysql
Murmel

นั่นเป็นข้อเสนอแนะที่ดี! น่าเสียดายที่ยังมีบางคนที่มีเหตุผลหลายประการ (รวมถึงตัวเอง) ยังคงติดอยู่โดยใช้ mysql เวอร์ชั่นที่เก่ากว่า 5.7
Craig

12

บางสมุทร -:

MySQL (อาจต้องการให้คุณเพิ่ม -u (ผู้ใช้) -p):

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

งูหลาม :

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 -e 'require "digest/sha1"; puts "*" + Digest::SHA1.hexdigest(Digest::SHA1.digest("right")).upcase'

ผลผลิตทั้งหมด:

* 920018161824B14A1067A69626595E68CB8284CB


ขอบคุณฉันเชื่อมโยงคำตอบของคุณในserverfault.com/a/846281/236916
mwfearnley

@alexjhart ฉันจะได้รับการอัปเดตสำหรับอัลกอริทึมการแฮชของรหัสผ่าน mysql 5.7.8 ใหม่ได้หรือไม่? (อาจมีรายละเอียดเล็ก ๆ น้อย ๆ เกี่ยวกับวิธีที่คุณค้นพบสิ่งนี้ด้วยเช่นกัน?)
ThorSummoner

6

มันยังคงเป็นเรื่องที่น่าแปลกใจที่ MySQL ไม่สนใจรหัสผ่านที่สับสนในบรรทัดคำสั่งและในบันทึก และนั่นเป็นเหตุผลเดียวที่ฉันเพิ่มคำตอบมากกว่าแค่แสดงความคิดเห็นในคำตอบ @Gilles

ดังนั้นแน่นอนคุณ สามารถเข้าสู่ระบบ MySQL ในฐานะผู้ดูแลระบบและตั้งรหัสผ่านใหม่สำหรับผู้ใช้ blayo ของคุณตามที่ @patrix แนะนำ

อย่างไรก็ตามวิธีมาตรฐานในการทำเช่นนั้นก็คือการใช้ฟังก์ชั่นรหัสผ่านของ MySQL () ซึ่งใช้รหัสผ่านธรรมดาเป็นอาร์กิวเมนต์ (อย่างจริงจัง?)

หากคุณทำเช่นนั้นคุณจะปล่อยรหัสผ่านของผู้ใช้ MySQL ไว้ในประวัติทุบตีและในบันทึก MySQL ของคุณเพื่อให้สามารถเรียกดูได้ง่ายในภายหลังโดยใครก็ตามที่สามารถเข้าถึงไฟล์บันทึกเหล่านั้นได้

มันจะดีกว่าไหมถ้ามียูทิลิตี้เล็ก ๆ น้อย ๆ ที่จะขอรหัสผ่านโดยไม่ต้องสะท้อนไปที่หน้าจอหรือบันทึกของคุณจากนั้นให้แฮชที่เข้ากับ MySQL ได้

ดังนั้นการแก้ไขคำตอบของ @Gilles เพียงเล็กน้อยแล้วเชลล์สคริปต์ตัวเล็ก ๆ ที่ใช้ Python เหมือนดังต่อไปนี้ คุณสามารถแก้ไขสิ่งนี้เพื่อรันคำสั่ง SQL กับฐานข้อมูล MySQL ของคุณเพื่อตั้งรหัสผ่านทั้งหมดในครั้งเดียว แต่ถึงแม้จะไม่ไปไกลเพียงแค่คัดลอกและวางแฮชผลลัพธ์ลงในคำสั่ง SQL เพื่ออัปเดตตารางผู้ใช้:

#!/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 พิมพ์โดยไม่ต้อง linebreak
  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)}'incovenient: และคุณไม่จำเป็นต้องกังวลเกี่ยวกับ NL และแม้กระทั่งยัติภังค์ในที่xxd -r -pที่พวกเขากำลังถูกละเว้น
dave_thompson_085

4

กัญชาเป็น sha1 (sha1 (รหัสผ่าน)) เนื่องจากไม่มีเกลือ (ซึ่งเป็นข้อบกพร่องการรักษาความปลอดภัยหลุมฝังศพ) คุณสามารถมองขึ้นกัญชาในตาราง

ด้วยเครื่องมือ POSIX เพียงบวกsha1sumจาก GNU coreutils หรือ BusyBox, sha1 (sha1 (รหัสผ่าน)) นั้นน่ารำคาญที่จะคำนวณเนื่องจากsha1sumคำสั่งจะพิมพ์ข้อมูลย่อยในเลขฐานสิบหกและไม่มีเครื่องมือมาตรฐานที่จะแปลงเป็นไบนารี

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 มีไดเจสไดนามิคมาตรฐานในไลบรารี่มาตรฐานดังนั้นจึงเป็นซับแบบง่าย ๆ

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

หรือด้วยรหัสผ่านภายในหนึ่งซับ:

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

ฉันรักคำตอบนี้ด้วยจิตวิญญาณ แต่มันก็ไม่ได้ผลนัก เมื่อฉันกดปุ่ม Enter ก็ยังต้องการเก็บการอ่านแทนการย้าย นอกจากนี้อินพุต echos กลับไปที่หน้าจอซึ่งอาจไม่เป็นที่ต้องการ แล้วเรื่องแบบนี้ล่ะ? unix.stackexchange.com/a/155583/37401
Craig

@Craig วิธีอ่านอินพุตแบบอินเทอร์แอกทีฟนั้นเกินกว่าคำถาม ฉันคิดว่าสคริปต์มีรหัสผ่านอยู่แล้ว ปกติแล้วมันจะถูกเก็บไว้ในไฟล์มันเป็นเรื่องยากที่จะพิมพ์รหัสผ่านฐานข้อมูลแบบโต้ตอบ หากคุณต้องการอ่านอินพุตแบบโต้ตอบคุณสามารถใช้readเชลล์บิวด์อินเพื่ออ่านบรรทัด เรียกใช้stty echoก่อนถ้าคุณต้องการปิดเสียงสะท้อนและssty +echoเปิดอีกครั้ง ใน Python คุณสามารถใช้getpassโมดูล
Gilles 'หยุดความชั่วร้าย'

ใช่ฉันรู้ ... และยุติธรรมพอ! ฉันเกลียดการรักษาความปลอดภัยที่น่ากลัวยิ่งไกลออกไปตามถนนที่ฉันไปและการรักษาความปลอดภัยของ MySQL นั้นค่อนข้างน่ากลัวโดยทั่วไปดังนั้นฉันจึงมีแนวโน้มที่หัวเข่ากระตุกที่ต้องการฉีดข้อมูลเชิงลึกเกี่ยวกับความปลอดภัยเล็กน้อยทุกที่ที่ฉันมีโอกาส ;-)
Craig

1

หากคุณสร้างผู้ใช้และลืมรหัสผ่านนี่คือสิ่งที่คุณควรทำและง่ายกว่า

เรื่องนี้เกิดขึ้นกับฉันหลายสิบครั้งในขณะที่ฉันกำลังทำ 10 พันล้านรายการในครั้งเดียว วิธีที่ดีที่สุดที่ฉันกู้คืนรหัสผ่านของฉันคือ:

หยุดการทำงานของเซิร์ฟเวอร์ mysql เสียก่อน

ออก mysqld_safe --skip-grant-tables &

จากนั้นฉันเข้าสู่ระบบในฐานะ root โดยไม่ต้องใช้รหัสผ่านเพียงแค่ mysql -u mysql-user (มันจะให้คุณเข้าใช้หลังจาก mysqld_safe)

จากนั้นไปที่ตาราง mysql> user และอัปเดตรหัสผ่านสำหรับผู้ใช้

จากนั้นย้อนกลับและเริ่ม mysql ใหม่

ดูว่ามันใช้งานได้และแจ้งให้เราทราบ


ดูเหมือนว่าจะเป็นมากกว่าสำหรับกรณีที่คุณไม่สามารถเข้าสู่ระบบได้เลยแทนที่จะเป็นผู้ใช้ที่เฉพาะเจาะจง
mwfearnley


0

MySQL 4.1+ ใช้ double 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.