为什么第一个和最后一个命令行返回null ??
$ mysql -u root -ppass -Bse "SELECT ENCRYPT('p@ssW0rd', 'ñsñsñsñ');"
NULL
$ mysql -u root -ppass -Bse "SELECT ENCRYPT('p@ssW0rd', 'dafdadsfe');"
dac0rB9hTC86M
$ mysql -u root -ppass -Bse "SELECT ENCRYPT('p@ssW0rd', 'dafdadsfeñññ');"
dac0rB9hTC86M
$ mysql -u root -ppass -Bse "SELECT ENCRYPT('p@ssW0rd', CONCAT('6', SUBSTRING(SHA(RAND()), -16)));"
63YRpxd2B8u1A
$ mysql -u root -ppass -Bse "SELECT ENCRYPT('p@ssW0rd', CONCAT('$6', SUBSTRING(SHA(RAND()), -16)));"
c7hTUIQiUwO02
$ mysql -u root -ppass -Bse "SELECT ENCRYPT('p@ssW0rd', CONCAT('$6$', SUBSTRING(SHA(RAND()), -16)));"
NULL
我也执行了:
$ mysql -u root -ppass -Bse "SELECT CONCAT('$6$', SUBSTRING(SHA(RAND()), -16));"
$7b07151fc5373796
然后它来了魔术:
MariaDB [(none)]> SELECT ENCRYPT('p@ssW0rd', 'ñsñsñsñ');
+------------------------------------+
| ENCRYPT('p@ssW0rd', 'ñsñsñsñ') |
+------------------------------------+
| NULL |
+------------------------------------+
1 row in set (0.00 sec)
MariaDB [(none)]> SELECT ENCRYPT('p@ssW0rd', CONCAT('$6$', SUBSTRING(SHA(RAND()), -16)));
+------------------------------------------------------------------------------------------------------------+
| ENCRYPT('p@ssW0rd', CONCAT('$6$', SUBSTRING(SHA(RAND()), -16))) |
+------------------------------------------------------------------------------------------------------------+
| $6$0edfe4f3541e5035$kYDyVhQ2sEHDlZE2GsNX0s2Xstg8z7Mj.D3ly.A0DzItg/5WIGoZldKQ0uSiaW9X/ljmmjGbWkMJwsY/WZ4/p. |
+------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
这非常烦人,因为我想从命令行插入一个密码字段不为空的表:
$ mysql -u root -ppass -Bse "INSERT INTO servermail.virtual_users (id, domain_id, password , email) VALUES ('1', '1', ENCRYPT('s1perP@$$', CONCAT('$6$', SUBSTRING(SHA(RAND()), -16))), 'new@user.com');"
ERROR 1048 (23000) at line 1: Column 'password' cannot be null
$ "INSERT INTO servermail.virtual_users (id, domain_id, password , email) VALUES ('1', '1', ENCRYPT('s1perP@$$', CONCAT('$6$', SUBSTRING(SHA(RAND()), -16))), 'new@user.com');" | mysql -u root -ppass
ERROR 1048 (23000) at line 1: Column 'password' cannot be null
答案 0 :(得分:1)
首先:不要使用MySQL ENCRYPT()
功能。通过使用它,您将向数据库服务器发送未加密的密码,这可能会使它们受到损害(特别是如果您的数据库服务器位于远程计算机上)。它将在MySQL的未来版本中不再可用,因此在新应用程序中使用它是不明智的。
第二:如果你打算使用ENCRYPT()
功能,尽管我有警告,你需要了解它如何使用salt
参数。随机选择的值不太可能有效,特别是如果它们包含非ñ
等非ASCII字符,并且会导致函数返回NULL。如果您没有盐,请将该参数保留为使用随机生成的盐,而不是尝试自己生成盐。
答案 1 :(得分:1)
@David pointet朝着正确的方向发展:你的问题与MySQL无关 - 你只是没有正确使用Shell转发!
“crypt('$ 6',......”由Shell评估为“crypt('',...”,以及“crypt('6',......”被视为传统) DES盐。
“crypt('$ 6 $',...”被评估为“crypt('$',...”,它给出NULL,因为“$”不是盐的有效字符。
对于第一个示例,如果salt不以“$”开头,则将其视为传统的DES salt,并且仅采用前两个字符。它们必须是[a-zA-Z0-9./]。因此,第一个特殊字符给出NULL,但在第三个例子中它们是无关紧要的。
有关盐的更多信息,请参见crypt(3)联机帮助页。
[编辑:] 更好的编写命令的方法: a)引用$ characters:
mysql -Bse "SELECT ENCRYPT('p@ssW0rd', CONCAT('\$6\$', SUBSTRING(SHA(RAND()), -16)));"
b)在SQL中使用shell中的单qutoes和SQL中的双引号,即使它对SQL标准不严格(MySQL接受它,Postgres也不会)
mysql -Bse 'SELECT ENCRYPT("p@ssW0rd", CONCAT("$6$", SUBSTRING(SHA(RAND()), -16)));'
c)将SQL写入文件并使用
mysql < my.sql