postgresql - 将 MS SQL 哈希文本转换为 Postgres 哈希文本

标签 postgresql hash

我正在努力将我们所有的数据库从 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。

所以,我只想知道是否有可能遵循以下解决方案?

  1. 将 MS SQL 中生成的十六进制值转换为十六进制值 等同于使用 VARCHAR 数据类型(即 在 Postgres 中相同的值)
  2. 将 UTF8 文本转换为 UTF16 文本 Postgres(甚至通过任何类型的扩展)并生成十六进制值 这相当于在 MS SQL 中生成的值

最佳答案

让我们依次看看您的建议:

  1. Convert hexadecimal value generated in MS SQL to hex value equivalent to that generated by using VARCHAR datatype (which is same value in Postgres)

这归结为将用户密码从 UTF-16 转换为 UTF-8(或其他编码)并重新散列。为此,您需要知道用户的密码,从理论上讲,您不知道 - 这就是首先对其进行哈希处理的目的。

在实践中,您使用的是未加盐的 SHA1 哈希,其中存在大型预计算表,并且使用 GPU 优化算法对其进行暴力破解是可行的。因此,“灰帽”选项是破解所有用户的密码,然后重新散列它们。

如果您这样做,使用 salt 和更好的散列函数重新散列它们以及将它们转换为 UTF-8 可能是明智的。

  1. Convert UTF8 texts to UTF16 texts in Postgres (even by any kind of extensions) and generate hex values which would be equivalent to values generated in MS SQL

从理论上讲,这更简单,您只需要一个例程来进行字符串转换。但是,正如您所发现的,Postgres 中没有对此的内置支持。

对于任何完全由 ASCII 字符组成的字符串,转换很简单:在字符串的每个字节前插入一个 NULL 字节(十六进制 00)。但这会破坏任何使用不在此范围内的字符的密码。

另一种方法是将生成哈希的责任移出数据库:

  1. 从数据库中检索散列。
  2. 确保用户的输入在您的应用程序中表示为 UTF-16,并计算其哈希值。
  3. 如果有效,您现在可以使用更好的算法生成一个新哈希(因为您知道用户刚刚输入的密码),并将其存储在数据库中而不是旧哈希。
  4. 所有活跃用户至少登录一次后,您将没有剩余的 SHA1 哈希值,并且可以完全取消对它们的支持。

关于postgresql - 将 MS SQL 哈希文本转换为 Postgres 哈希文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52330183/

相关文章:

java - 代码部分我不明白

sql-server-2005 - GUID是好盐吗?我的注册/登录过程有什么缺陷吗?

Python unhash 值

c++ - 在不使用循环的情况下查找给定数字属于哪一组数字(范围)

node.js - Heroku Postgres 无法在 Windows 上拉动和推送

sql - 添加新列 SQL 查询

postgresql - Hibernate 与分区表

sql - 在 SQL 连接结果中查找组最大值

algorithm - 无法理解 topcoder 解释的 Rabin Karp 算法的哈希函数

c - 两个单词散列到相同的值