[英]Updating MySQL column values to a random 16 char alphanum string
我在MySQL中创建了一个名为password_salt_c
的列
我想为数据库中的每条记录设置一个随机的16个字符的字母数字字符串。
有215,000条记录。 我尝试在PHP中执行此操作,但它耗尽了服务器上的所有内存。
如何在MySQL中完成?
目前尚不清楚您实际上要解决什么问题。 (我的回答有意忽略要填充的列的名称,而忽略了所问问题的上下文。)
如果我需要为表中的所有行的列分配“随机的16个字符的字母数字字符串” ,这是一次性的,那么我可能会执行以下操作:
UPDATE mytable SET mycol =
CONCAT(SUBSTR('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789',FLOOR(1.0+RAND()*62),1)
,SUBSTR('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789',FLOOR(1.0+RAND()*62),1)
,SUBSTR('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789',FLOOR(1.0+RAND()*62),1)
,SUBSTR('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789',FLOOR(1.0+RAND()*62),1)
,SUBSTR('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789',FLOOR(1.0+RAND()*62),1)
,SUBSTR('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789',FLOOR(1.0+RAND()*62),1)
,SUBSTR('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789',FLOOR(1.0+RAND()*62),1)
,SUBSTR('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789',FLOOR(1.0+RAND()*62),1)
,SUBSTR('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789',FLOOR(1.0+RAND()*62),1)
,SUBSTR('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789',FLOOR(1.0+RAND()*62),1)
,SUBSTR('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789',FLOOR(1.0+RAND()*62),1)
,SUBSTR('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789',FLOOR(1.0+RAND()*62),1)
,SUBSTR('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789',FLOOR(1.0+RAND()*62),1)
,SUBSTR('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789',FLOOR(1.0+RAND()*62),1)
,SUBSTR('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789',FLOOR(1.0+RAND()*62),1)
,SUBSTR('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789',FLOOR(1.0+RAND()*62),1)
)
请注意,表达式FLOOR(1.0+RAND()*62)
旨在返回1到62范围内的伪随机整数。它用作SUBSTR
函数的参数,以返回单个字母数字字符。 捣出16个重复,将结果连接起来...瞧,这是一个伪随机的16个字符的字母数字字符串。
请不要尝试进行自己的安全性编程。 如果犯了一点点错误,很难正确地进行,并且容易使错误的人破解。 如果您要生成自己的大量伪随机数集合,则容易犯系统错误。
相反,请查看PHP函数password_hash和password_verify 。
这些函数并没有存储一个单独的盐域(如您建议的那样),而是遵循在哈希密码字符串中包含盐的约定。 password_hash
遵循加密最佳实践,即随机分配盐。
因此,当用户提供新的纯文本密码(更改或设置密码)时,您可以这样做:
$hashed_password = password_hash ( $plaintext, PASSWORD_DEFAULT );
unset ( $plaintext );
您应该将该$hashed_password
字符串存储在数据库的varchar(255)列中。 该函数生成随机盐,然后将其与明文密码一起使用以生成哈希密码,然后将盐和哈希密码存储在一起。 通常,它按顺序运行哈希函数十次。
(我出于谨慎考虑而使用unset()
函数,以避免将纯文本密码的副本保留在RAM中的时间超过必要的时间。)
然后,稍后当用户提供密码以获取访问权限时,您可以执行以下操作:
if (password_verify( $plaintext, $hashed_password )) {
/* the password is correct, grant access */
unset( $plaintext );
/* do what the user wanted to do. */
}
else {
/* the password did not match */
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.