与mysql相同的方式加密密码


15

我已经创建了一个用户...但是忘记了密码

mysql>创建用户'blayo'@'%',并以'right'标识;

哪个Linux命令行工具可以像mysql 5.5一样加密密码?

mysql>从mysql.user中选择Password,User
------------------------------------------ + ------- +
* 920018161824B14A1067A69626595E68CB8284CB | blayo |

...确保我使用正确的

$工具右
* 920018161824B14A1067A69626595E68CB8284CB

2
为什么不能仅以管理员身份登录并为其定义新密码blayo?这绝对比遍历数万亿个可能的字符组合来找到正确的字符要快。
nohillside 2012年

Answers:


13

好吧,琐碎的(也许是作弊的)方式是运行:

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

这将使用您的mysql版本使用的任何密码哈希方案生成密码。[ 编辑:添加了-NB,它消除了列名和ascii表的样式。]


6
而且,这将方便地将您的闪亮新密码以明文形式存储在MySQL日志和bash帐户历史记录日志中。
Craig

@Craig为防止两者,您可以在b的mysql历史记录之前将''(空格)隐藏起来,也可以在MySQL日志SET sql_log_off=ON;中将SELECT ...其隐藏在bash历史记录之前。
Murmel

1
@Murmel感谢您的更新!当然,它应该默认为不记录密码。安全性应始终是默认设置。
克雷格

@Craig公平地说,这已经由mysql(v5.7,该函数存在的最新版本,已通过v8.0.11删除)在以下位置完成:1.客户端(影响.mysql_history),忽略所有匹配的语句*PASSWORD*; 2.服务器端几个stmts(除外SELECT)。请参阅:MySQL 5.7手册-密码和日志记录MySQL 5.7-手册
-mysql

很好的反馈!不幸的是,仍然有很多人出于各种原因(包括我自己)仍然使用5.7以上的mysql版本。
Craig

12

一些单线:

MySQL(可能需要您添加-u(user)-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 -e 'require "digest/sha1"; puts "*" + Digest::SHA1.hexdigest(Digest::SHA1.digest("right")).upcase'

所有输出:

* 920018161824B14A1067A69626595E68CB8284CB


谢谢,我已经将您的答案链接到serverfault.com/a/846281/236916
mwfearnley,2015年

@alexjhart我可以获取新的MySQL 5.7.8密码哈希算法的更新吗:)?(也许还有关于您如何发现此问题的一些细节?)
ThorSummoner

6

我仍然对MySQL不会在命令行和日志中混淆密码感到困惑。这是我添加答案的唯一原因,而不仅仅是评论@Gilles答案。

因此,当然,您可以按照@patrix的建议,以管理员身份登录MySQL并为blayo用户设置新密码。

但是,执行此操作的标准方法是使用MySQL的password()函数,该函数将纯文本口令作为参数(严重吗?)。

如果这样做,您将在bash历史记录和MySQL日志中保留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 2014年

3
嗯 老实说,您没有意识到自己做了什么(显然您已经添加了这一<!-- language: lang-bsh -->行)。便利!我喜欢。谢谢!
克雷格

5

使用shell的另一种方法:

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))。由于没有(这是一个严重的安全缺陷),因此您可以在table中查找哈希值

仅使用POSIX工具以及sha1sum来自GNU coreutils或BusyBox的工具,sha1(sha1(password))令人讨厌,因为该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键时,它仍然想继续阅读输入内容而不是继续前进。同样,输入回显到屏幕,这可能是不希望的。这样的事情怎么样?unix.stackexchange.com/a/155583/37401
Craig

@Craig如何阅读交互式输入超出了问题的范围。我假设脚本已经有密码;通常它存储在文件中,很少以交互方式键入数据库密码。如果您想读取交互式输入,则可以使用read内置的shell来读取一行;运行stty echo,如果你想关闭回声和第一ssty +echo至重新打开它。在Python中,您可以使用getpass模块。
吉尔斯(Gillles)“所以-别再邪恶了”(

是的,我知道...而且还算公平!我只是讨厌更可怕的安全性,而MySQL安全性总体上来说是非常可怕的,因此我倾向于在需要的地方注入一些安全性见解。;-)
Craig

1

如果您创建了一个用户却忘记了密码,这就是您应该做的,并且更容易。

当我一次做100亿件事时,这也发生了十二次。恢复密码的最好方法是:

首先完全停止mysql服务器

发出mysqld_safe --skip-grant-tables&

然后我以root用户身份登录而没有发出密码,只是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

该算法可以轻松移植到其他语言。不同之处在于“选择密码”中的密码哈希值始终以“ *”字符开头。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.