【问题标题】:PostgreSQL hash a column using SHA256 and a pre-defined saltPostgreSQL 使用 SHA256 和预定义的盐对列进行哈希处理
【发布时间】:2021-02-25 17:06:48
【问题描述】:

我正在使用:x86_64-pc-linux-gnu 上的 PostgreSQL 11.6,由 gcc (GCC) 4.9.3 编译,在 AWS 上作为 Aurora (RDS) 运行的 64 位。

我已经设法让下面的工作

SELECT encode(digest('email@example.com', 'sha256'),'hex');

但我需要使用第 3 方提供的盐。假设为了争论,盐是“this_is_my_salt”。我该如何使用它?我只能找到使用算法生成盐的示例。

供应商希望我们使用他们的哈希值将他们数据库中的电子邮件地址与我们的进行比较。他们没有指定他们的数据库系统,但向我展示了他们的查询:

SELECT 'email@example.com' as unhashed_email, sha2('shared_salt_value' || lower('email@example.com')) as hashed_email

这对我使用以下答案之一在 postgres 中尝试示例产生不同的哈希:

SELECT encode(digest('email@example.com' || 'shared_salt_value', 'sha256'),'hex');

我的哈希以 db17e.... 开头 他们的哈希以 b6c84.... 开头。

可能是编码或其他导致差异的原因吗?

【问题讨论】:

    标签: postgresql hash sha


    【解决方案1】:

    这很简单,只需将字符串与盐连接:

    SELECT encode(digest('this_is_my_salt' || 'email@example.com', 'sha256'),'hex');
    

    【讨论】:

    • 您的示例有效并生成了一个哈希(与其他示例一样),但由于某种原因,生成的哈希与供应商系统的哈希不匹配(他们向我展示了他们正在使用的查询和结果哈希,但不是他们使用的数据库技术)。我只知道他们指定了 SHA256(我正在这样做)。我已经根据我掌握的信息更新了我的答案。
    • 你没有说你想复制别人的算法。显然,他们以不同的方式使用盐。为什么不向他们询问他们正在使用的算法?有了良好的安全性,他们就不必保密了。
    • 我确实问过他们。他们只是建议他们将 SHA256 与我上面显示的盐示例一起使用。我没有说我想“复制别人的算法”,因为据我了解,如果您使用 SHA256 和相同的盐,您应该期望相同的字符串具有相同的哈希值(在这种情况下是电子邮件地址) .但是,他们向我展示的示例哈希值与我使用上面的示例或我能找到的任何其他示例生成的不同。
    • 如果我将电子邮件地址和 salt 在我的示例中放入此网站 symbionts.de/tools/hash/sha256-hash-salt-generator.html,它会生成与供应商显示的相同的散列值。以本网站为例,为什么 PostgreSQL 会产生不同的价值?
    • 那个网页说它使用SHA256(SALT(STRING)+STRING) - 这就是算法。所以他们以相反的方式将它们连接起来。我已经调整了我的答案。
    猜你喜欢
    • 2012-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-12
    相关资源
    最近更新 更多