我创建了一个用户...但忘记了密码
mysql> 创建由 'right' 标识的用户 'blayo'@'%';
哪个Linux命令行工具可以与 mysql 5.5 一样加密密码吗?
mysql> 从 mysql.user 中选择密码、用户 ------------------------------------------+-------- + *920018161824B14A1067A69626595E68CB8284CB |布莱约 |
...确保我使用正确的
$ 工具右 *920018161824B14A1067A69626595E68CB8284CB
答案1
一些单行:
MySQL(可能需要您添加 -u(user) -p):
mysql -NBe "select password('right')"
Python:
python -c 'from hashlib import sha1; print "*" + sha1(sha1("right").digest()).hexdigest().upper()'
珀尔:
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
答案2
好吧,微不足道的(也许作弊)方式是运行:
mysql -NBe "select password('right')"
这将使用您的 mysql 版本使用的任何密码散列方案生成一个密码。 [编辑:添加了 -NB,它去掉了列名和 ascii 表艺术。]
答案3
另一种使用 shell 的方式:
echo -n 'right' | sha1sum | xxd -r -p |\
sha1sum | tr '[a-z]' '[A-Z]' | awk '{printf "*%s", $1}'
解释:
echo -n
打印时不换行sha1sum
第一个 SHA1xxd -r -p
取消十六进制哈希sha1sum
第二个 SHA1tr '[a-z]' '[A-Z]'
转换为大写awk '{print "*" $1}'
添加前导 *
更多细节:
在 2. 和 3. 之间, awk '{printf "%s", $1}'
可以插入一个可选步骤来删除换行符和连字符。但 xxd 无论如何都会忽略它们(感谢 dave_thompson_085)。
{print "*" toupper($1)}
此外,通过将步骤 5 和 6 替换为(感谢 dave_thompson_085),可以立即完成步骤 5 和 6 。
答案4
哈希值是 sha1(sha1(密码))。既然没有盐(这是一个严重的安全漏洞),你可以在表中查找哈希值。
仅使用sha1sum
GNU coreutils 或 BusyBox 中的 POSIX 工具加上 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()'