Chris Muench Asked: 2015-11-01 16:36:34 +0800 CST2015-11-01 16:36:34 +0800 CST 2015-11-01 16:36:34 +0800 CST MySQL 安全随机字符串生成器 772 我希望为 MySQL 中的密码重置生成一个加密安全字符串。我知道我可以在 PHP 的应用程序级别做到这一点;但这需要我的许多客户可能没有的 OpenSSL 扩展。 如果我可以在 MySQL 5 中以一种广泛可用的安全方式做到这一点,那将是理想的。这可能吗? 注意:这是为了生成密码重置的安全令牌。它与安全连接没有任何关系,因此使用 https 不是解决方案。 mysql security 3 个回答 Voted Best Answer Tim Penner 2016-03-12T11:42:42+08:002016-03-12T11:42:42+08:00 mySQL 中有许多可用的加密方法。 如果您需要双向加密,您可以使用aes_encrypt附带的aes_decrypt 如果您只需要安全哈希,那么您可以使用sha2 以下语句可以为您提供类似的结果openssl_random_pseudo_bytes SELECT HEX(SHA2(CONCAT(NOW(), RAND(), UUID()), 512)); 上面的语句将NOW()它与RAND()a连接起来UUID(),然后对结果执行 512 位SHA2()加密,然后将其转换为HEX() Rob 2016-07-08T10:15:57+08:002016-07-08T10:15:57+08:00 这是 MySQL 的随机数生成器: double my_rnd(struct rand_struct *rand_st) { rand_st->seed1= (rand_st->seed1*3+rand_st->seed2) % rand_st->max_value; rand_st->seed2= (rand_st->seed1+rand_st->seed2+33) % rand_st->max_value; return (((double) rand_st->seed1) / rand_st->max_value_dbl); } 您将需要从外部传入一个大的随机值。假设您需要一个保证唯一的 512 位随机数。这可能就足够了: sha2(concat(now(),rand(),gibberish512,id),512) 假设 gibberish512 是一个存储过程的 arg,它在很多值上调用 rand,所有这些都在几毫秒内,并且时间戳会在那个时候泄露。MySQL rand() 本身的熵少于 64 位。从外部传入一个随机参数(由随机输入、掷骰子或适当的加密随机 prng 等生成)。 Cris 2018-11-09T12:03:10+08:002018-11-09T12:03:10+08:00 BEGIN declare r tinytext; declare s tinytext default '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ'; declare n int; set r=''; while length(r)<=16 do set n=rand() * 61; set r=concat(r,substr(s,n,1)); end while; select r; END
mySQL 中有许多可用的加密方法。
如果您需要双向加密,您可以使用
aes_encrypt
附带的aes_decrypt
如果您只需要安全哈希,那么您可以使用
sha2
以下语句可以为您提供类似的结果
openssl_random_pseudo_bytes
上面的语句将
NOW()
它与RAND()
a连接起来UUID()
,然后对结果执行 512 位SHA2()
加密,然后将其转换为HEX()
这是 MySQL 的随机数生成器:
您将需要从外部传入一个大的随机值。假设您需要一个保证唯一的 512 位随机数。这可能就足够了:
假设 gibberish512 是一个存储过程的 arg,它在很多值上调用 rand,所有这些都在几毫秒内,并且时间戳会在那个时候泄露。MySQL rand() 本身的熵少于 64 位。从外部传入一个随机参数(由随机输入、掷骰子或适当的加密随机 prng 等生成)。