将MySQL密码查询移植到Postgres

时间:2013-10-29 21:33:47

标签: mysql security postgresql

我有一部分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的输出,则输出相同。但是,如果我将它与salt的输出结合起来,则输出会有所不同;

MySQL的:

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

的PostgreSQL:

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

有人可以解释为什么这些语句出现分歧或建议更好的方法来实现这个MySQL查询吗?

2 个答案:

答案 0 :(得分:0)

他们分歧是因为他们使用不同的加密算法。

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

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

答案 1 :(得分:0)

PostgreSQL核心或主要来源随附的LoginActivity扩展名不支持

class LoginActivity : BaseActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) } override fun setStyle() { setContentView(R.layout.activity_login) login.setOnClickListener { } register.setOnClickListener { } } } 。问题中显示的[ngModel]函数来自SHA512-CRYPT,并且仅支持bf,md5,des和xdes(请参见documentation中的“支持的算法”)。

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

pgcrypto

与MySQL的crypt

具有相同的结果