我有一部分 MySQL 查询旨在使用 SHA512-CRYPT 保存密码:
SELECT ENCRYPT('firstpassword', CONCAT('$6$', SUBSTRING(SHA(RAND()), -16)))
我需要移植应用程序以使用 PostgreSQL,因此,该语句不兼容。我在 PostgreSQL 中的尝试是这样的:
SELECT CRYPT('firstpassword'::text, CONCAT('$6$', SUBSTRING(ENCODE(DIGEST(RANDOM()::text , 'sha1'), 'hex') FROM '.{16}$')))
在组件中进行测试时,这些实现中的每一个看起来都是相同的,但作为完整的语句,输出会有所不同。
我发现CONCAT
(生成盐的)语句似乎提供了相同的输出。
如果我尝试比较CRYPT
或ENCRYPT
使用简单明文单词的输出,则输出是相同的。但是,如果我将它与盐的输出结合起来,输出会有所不同;
MySQL:
SELECT ENCRYPT( 'firstpassword', '$6$ae73a5ca7d3e5b11' )
Produces: $6$ae73a5ca7d3e5b11$v/RbcEEx4VR37VMUF6gBnPNo2ptSyU...
PostgreSQL:
SELECT CRYPT('firstpassword'::text, '$6$ae73a5ca7d3e5b11'::text)
Produces: $6eTK2KpfoaQM
有人可以解释为什么这些陈述会出现分歧或提出更好的方法来实现这个 MySQL 查询吗?