1

我有一部分 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(生成盐的)语句似乎提供了相同的输出。

如果我尝试比较CRYPTENCRYPT使用简单明文单词的输出,则输出是相同的。但是,如果我将它与盐的输出结合起来,输出会有所不同;

MySQL:

SELECT ENCRYPT( 'firstpassword', '$6$ae73a5ca7d3e5b11' )
Produces: $6$ae73a5ca7d3e5b11$v/RbcEEx4VR37VMUF6gBnPNo2ptSyU...

PostgreSQL:

SELECT CRYPT('firstpassword'::text, '$6$ae73a5ca7d3e5b11'::text)
Produces: $6eTK2KpfoaQM

有人可以解释为什么这些陈述会出现分歧或提出更好的方法来实现这个 MySQL 查询吗?

4

2 回答 2

0

它们之所以不同,是因为它们使用不同的加密算法。

您要做的第一件事是非常熟悉 pg_crypto 文档。见http://www.postgresql.org/docs/9.2/static/pgcrypto.html

我的怀疑是,您可能希望从加密/加密之类的东西切换到使用 SHA-2 来进行实际的密码散列,这样您就可以专门控制算法并确保双方的兼容性。

于 2013-12-03T04:51:14.827 回答
0

SHA512-CRYPTpgcryptoPostgreSQL 核心或主要源附带的扩展不支持。问题中显示的crypt函数来自pgcrypto并且仅支持 bf、md5、des 和 xdes(请参阅文档中的“支持的算法” )。

但是您可以使用shacrypt扩展名:

test=# create extension shacrypt ; -- (after installing from the sources)
CREATE EXTENSION

test=# select sha512_crypt('firstpassword', '$6$ae73a5ca7d3e5b11' );
                                                sha512_crypt                                                
------------------------------------------------------------------------------------------------------------
 $6$ae73a5ca7d3e5b11$v/RbcEEx4VR37VMUF6gBnPNo2ptSyU3ys1sg6i8hhBrcfBeLY6hpsfvXR67bwwjMainpPEaLkYV6eO0ow0xVH.

给出与 MySQL 相同的结果SELECT ENCRYPT( 'firstpassword', '$6$ae73a5ca7d3e5b11' )

于 2020-06-20T14:46:49.217 回答