【发布时间】:2019-02-19 03:52:21
【问题描述】:
我正在将我们所有的数据库从 MS SQL 服务器迁移到 Postgres。在这个过程中,我正致力于在 Postgres 中编写等效代码,以生成在 MS SQL 中获得的相同散列文本。
以下是我在 MS SQL 中的代码:
DECLARE @HashedText nvarchar(50)
DECLARE @InputText nvarchar(50) = 'password'
DECLARE @HashedBytes varbinary(20) -- maximum size of SHA1 output
SELECT @HashedBytes = HASHBYTES('SHA1', @InputText)
SET @HashedText = CONVERT(nvarchar(50), @HashedBytes, 2)
SELECT @HashedText
这将产生值E8F97FBA9104D1EA5047948E6DFB67FACD9F5B73
以下是用 Postgres 编写的等效代码:
DO
$$
DECLARE v_InputText VARCHAR = 'password';
DECLARE v_HashedText VARCHAR;
DECLARE v_HashedBytes BYTEA;
BEGIN
SELECT
ENCODE(DIGEST(v_InputText, 'SHA1'), 'hex')
INTO
v_HashedBytes;
v_HashedText := CAST(v_HashedBytes AS VARCHAR);
RAISE INFO 'Hashed Text: %', v_HashedText;
END;
$$;
这会产生值5baa61e4c9b93f3f0682250b6cf8331b7ee68fd8。
花了一些时间后,我了解到在 MS SQL 中将数据类型“NVARCHAR”替换为“VARCHAR”会产生与 Postgres 相同的结果。
现在问题出在 MS SQL 中,我们已经将密码散列并存储在数据库中,如上所示。我无法将 MS SQL 中的散列文本转换为 Postgres,也无法在 Postgres 中生成相同的散列文本,因为 Postgres 不支持 UTF-16 unicode。
所以,我只是想知道是否有以下解决方案的可能性?
- 将 MS SQL 中生成的十六进制值转换为十六进制值 等同于使用 VARCHAR 数据类型生成的数据类型(即 Postgres 中的值相同)
- 将 UTF8 文本转换为 UTF16 文本 Postgres(甚至通过任何类型的扩展)并生成十六进制值 这相当于在 MS SQL 中生成的值
【问题讨论】:
-
你不应该使用
SHA1annymore,尤其是没有盐和/或胡椒的情况下,因为现有的SHA1彩虹表可以在几秒钟内“解密”SHA1散列。除了SHA1算法在 CPU 上是一种快速算法,但在 GPU 上也是如此,它可以在现代 GPU 硬件上轻松完成每秒 100 万次以上的计算。 -
这是非常不安全的代码。对于初学者来说,密码似乎是以明文形式传输的。密码也需要被散列 多次 次,即使使用强大的散列算法(如 SHA25、SHA512)也是如此。 1000 次迭代是典型的。单个 SHA1 非常弱
-
此外,真正的哈希是字节数组,而不是字符串。哈希存储在哪里,以什么形式?作为
varbinary(20)还是varchar? BTWVARCHAR没有长度并不意味着任意长度。我认为默认长度是 30。您可能已经截断了哈希
标签: postgresql hash