【问题标题】:How does hybris store password hasheshybris 如何存储密码哈希
【发布时间】:2020-11-18 07:21:24
【问题描述】:

TLDR: Hybris 在将密码散列存储到数据库之前会如何处理它们?因为数据库字段中的值不是标准的密码哈希。


我必须在上面添加 TLDR,因为有两个用户发布的答案表明他们没有阅读(或理解)该问题。

我正在使用 Hybris 1905。当我在后台设置用户密码时,我可以选择散列算法的类型,包括 MD5、SHA-256 和其他一些算法。然而,存储在数据库中的密码值显然不是算法的简单哈希。例如,这里是密码test1234 的哈希值,具有各种哈希算法:

  • 盐渍 MD5:1:Gtjd5QVM/t0HLT5PvZCU4g==s9B8Vw/BIkzixwzMzueRR1R6WY9y8Fq9BqFqwGIuY2fGK+KFYSXjNf5G0fbAlb9u
  • SHA-256:1:etvHTnwzMfX/DnbNPhmQBA==8jq6sLLcb/PrIhVB9D+YA61L2mr0dlBYr/84G/K9Kzqe4gpvPF10ja8RaIE94b3A+joszlMutGrHezDs871A/8Yr4oVhJeM1/kbR9sCVv24=
  • SHA-512:1:ZSaQW0C+r/NMVwRRVTCm9w==4qQJdmvU4PE02ipY0Mvkp2sb+bMuMHTiMIVE2m6NESzv2BEFG2O1MIjkzFUES6f7jzoVOEuVmd/E8mqOUoogbL9rpkOPmeMEj5EpB2iued3UAouLvv6PuUCyFJGJdoRsZJzwO2Lj30iokY4RsG0OKXYuGdUjNYU7X1AUggH+eWfGK+KFYSXjNf5G0fbAlb9u
  • PBKDF2 (HMAC-SHA1):1:HIKWvUwTA/pVC9mXzl9qgw==NOsr8pkNUIbEGoiWFa5oArnlEfZNALK0cuczK7dxtxHbDTby+7w3ml1pf8HNmXjalq1A/tSvlb+gwZMRS4Q7ncMhU5w1b6HwV+BGEBG9ecqahzUOK7mNZrLbh9t50M0mRr2AVQJnn7bfvdJ5E3C4UPdoN44v1mAgIuC/9RKTnhj/1BhjHqKf1pozhFfoBz8FdSxBQMmKY91/c4VzkinqiSy5wkaWjOSQQuAN9ZoWmvw=
  • BCrypt:1:GL1kPl93Nx4RjOymIhC1Kw==Xh9ZddGPIxUqpipcEvJ+bRHApEyWVPkXtxPlsYgzokUo4ktC/vh4weA6hrMEebtQC/OttaVzG3+9tUCHxFHCcw==

显然,这是 Hybris 在所选散列算法之上的某种编码 - 但它是什么?是编码(即可以解码)还是散列?

我需要将一个大型用户数据库从另一个平台迁移到这个 Hybris 安装。我有想要导入的现有用户名和相应的散列密码。这些是标准的 bcrypt 散列,因此相同的 test1234 字符串将具有散列 $2y$16$mK9cm.pwOp8ve9oH0VqkT.123HGy/RHYLcd1GB.N5zEqBylV.22wm。然而,我很难理解如何将此哈希导入 Hybris 用户表。

【问题讨论】:

    标签: passwords hybris password-hash password-storage


    【解决方案1】:

    Hybris 在将密码哈希存储到 数据库?因为数据库字段中的值不是标准的 密码哈希。

    这是因为 encodedPassword 属性声明了 encrypted="true" 修饰符。由于 hybris 在存储到数据库之前加密值。阅读更多关于 Transparent Attribute Encryption (TAE) 及其在 hybris 中的工作原理的信息。

     <attribute autocreate="true" qualifier="encodedPassword" type="java.lang.String">
                <persistence type="property" qualifier="Passwd">
                    <columntype>
                        <value>HYBRIS.LONG_STRING</value>
                    </columntype>
                </persistence>
                <modifiers read="true" write="true" search="true" optional="true" encrypted="true"/>
            </attribute>
    

    在您的情况下,您可能需要创建自己的密码编码器并将其设置为所有迁移的用户,以便您的系统设法使用自定义编码器对迁移的用户进行身份验证,然后您可以重定向用户以重置密码。在重置密码流程中,您可以使用新的 OOTB 编码器更新密码编码,以便生成新的哈希。

    其他参考12

    【讨论】:

    • 啊!这是有道理的。我不明白为什么我需要更改编码器或让用户重置他们的密码。我创建了一个新的编码器并将其添加到系统中。现在,当我在后台查看用户记录时,我可以选择我的新编码器作为密码 - 所以我应该能够按原样导入用户(我猜是使用带有 encodedPassword 字段的 impex)
    • 如果您想在整个项目中使用自定义编码器,则无需强制用户更新密码,但稍后,如果您想坚持使用 OOTB 提供的编码器,则可以重定向用户重置密码并使用 OOTB 编码器设置新密码。
    • Hybris 允许不同的用户使用不同的编码器。 “用户”模型实际上有一个属性,称为“密码编码”。因此,为导入的用户保留自定义编码器并没有错,但为新用户或稍后重置密码时使用 OOTB。
    • 是的,我知道。但我建议在所有用户中坚持使用统一编码器,这使我们的生活更容易进一步迁移/升级
    【解决方案2】:

    Hybris always stores passwords in an encoded format。 SAP Commerce 中的默认策略是PBKDF2。必要时,您可以通过default.password.encoding 属性对其进行更改。 您也可以通过实现PasswordEncoder 接口和adding the custom password encoding strategy beancore.passwordEncoderFactory bean 来implement your own password encoding strategy

    【讨论】:

    • 这与我的问题无关。请再读一遍,希望你能明白我在问什么。
    【解决方案3】:

    为了更正我的回答,Hybris 总是使用用户名和密码的组合创建一个哈希。

    --->PasswordEncoderFactoryImpl 类负责根据编码的输入给出正确的 Encoder 类。 --->factory.getEncoder(encoding).encode(user.getUID(), password)

    Hybris 支持

    您可以使用已经存在的测试用户进行测试并知道密码以生成基于哈希密钥的算法并匹配编码密码,它应该给出相同的结果。

    ---> 要验证它,只需编写简单的 groovy 和 groovy 输出,您可以通过后台与 groovy 中使用的测试用户进行比较并比较编码密码。 这里的编码是 pbkdf2

    【讨论】:

    • 这与我的问题无关。我在问 hybris 在使用所选算法创建哈希后对哈希做了什么。存储的哈希不是 md5 或 bcrypt,而是完全不同的东西。
    • 此外,密码无法解密,它们是一种散列方式,所以你的建议是尖的
    • @AleksG,我已经修改了答案,也许这会帮助你理解Hybris中hash的创建。
    • 我确实了解流程。我想知道的是hybris在创建哈希后会做什么,因为存储在数据库中的哈希不是在标准的pbkdf2、bcrypt、md5等格式中。
    • 生成的哈希也按照Transparent Attribute Encryption 加密,所以它不是按照标准生成的哈希
    猜你喜欢
    • 2015-10-07
    • 2012-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多