繁体   English   中英

将MySQL列值更新为随机的16个字符的alphanum字符串

[英]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_hashpassword_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM