以与 mysql 相同的方式加密密码

Phi*_*ayo 16 password encryption mysql

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

mysql> 创建由 'right' 标识的用户 'blayo'@'%';

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

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

...确保我使用正确的

$ 工具权
*920018161824B14A1067A69626595E68CB8284CB

小智 16

一些单线:

MySQL(可能需要您添加 -u(user) -p):

mysql -NBe "select password('right')"
Run Code Online (Sandbox Code Playgroud)

蟒蛇

python -c 'from hashlib import sha1; print "*" + sha1(sha1("right").digest()).hexdigest().upper()'
Run Code Online (Sandbox Code Playgroud)

珀尔

perl -MDigest::SHA1=sha1_hex -MDigest::SHA1=sha1 -le 'print "*". uc sha1_hex(sha1("right"))'
Run Code Online (Sandbox Code Playgroud)

PHP :

php -r 'echo "*" . strtoupper(sha1(sha1("right", TRUE))). "\n";'
Run Code Online (Sandbox Code Playgroud)

红宝石

ruby -e 'require "digest/sha1"; puts "*" + Digest::SHA1.hexdigest(Digest::SHA1.digest("right")).upcase'
Run Code Online (Sandbox Code Playgroud)

所有输出:

*920018161824B14A1067A69626595E68CB8284CB


jsb*_*ngs 15

好吧,微不足道的(也许是作弊)方法是运行:

mysql -NBe "select password('right')"
Run Code Online (Sandbox Code Playgroud)

这将使用您的 mysql 版本使用的任何密码散列方案生成密码。[编辑:添加 -NB,它摆脱了列名和 ascii 表艺术。]

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

Mur*_*mel 7

另一个使用shell:

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

解释:

  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)来立即完成。

  • `awk` 可以做大写,并且向终端输出不完整的(最后)行是不方便的:`.. | sha1sum | awk '{print "*" toupper($1)}'`。而且您无需担心 NL 甚至`xxd -r -p` 上的连字符,它们会被忽略。 (2认同)

Cra*_*lis 6

MySQL 不会在命令行和日志中混淆密码,这仍然让我大吃一惊。这就是我添加答案而不是仅仅评论@Gilles 答案的唯一原因。

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

然而,这样做的标准方法是使用 MySQL 的 password() 函数,它将明文密码作为参数(认真的?)。

如果这样做,您会将 MySQL 用户密码的纯文本版本留在您的 bash 历史记录和 MySQL 日志中,以便以后能够访问这些日志文件的任何人轻松检索。

拥有一个提示输入密码的小实用程序,而不将其回显到屏幕或日志中,然后为您提供生成的与 MySQL 兼容的哈希值不是更好吗?

所以,稍微修改一下@Gilles 的答案,一个使用 Python 的小 shell 脚本怎么样,如下所示。你可以很容易地修改它来对你的 MySQL 数据库运行一条 SQL 语句来一次性设置密码。但即使没有走那么远,只需将生成的哈希复制并粘贴到 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
Run Code Online (Sandbox Code Playgroud)

  • 啊,所以。老实说没有意识到你做了什么(你显然添加了 `<!-- language: lang-bsh -->` 行)。便利!我喜欢。谢谢! (3认同)