【问题标题】:SHA-256 custom length digestSHA-256 自定义长度摘要
【发布时间】:2015-06-18 16:52:23
【问题描述】:

我需要允许网站的老用户使用相同的凭据访问新网站。数据库服务器版本是 Microsoft SQL Server 2005,我无权更改数据库。数据库的密码列设置为 varchar(50),摘要为 48 个字符。我对密码的唯一信息是它们已经使用 sha-256 算法进行了哈希处理,但据我所知,sha-256 摘要是 64 个字符而不是 48 个字符。是否可以使用 sha256 生成相同的 48 个长度的摘要?

【问题讨论】:

  • 一个 SHA256 摘要是 32 字节,或 64 字节表示为十六进制字符串。 48 个字节可能是 Base64 编码的 SHA256 哈希。表中的摘要是否包含 A-Z 而不是 A-F?
  • @AlexK 我不确定我是否正确理解了您的问题。但表中的摘要我认为它是十六进制格式,例如。 c8fd968750b3303ad1bfa2ed5ad2dfe0d7a5661eef591e3a

标签: java sql-server security sha sha256


【解决方案1】:

本机输出大小为 192 位(48hex * 1byte/2hex * 8bit/byte)的唯一两个原始散列函数是 HAVAL-192 和 TIGER-192。其他都没有完全匹配。

如果它们确实使用 sha256 进行了散列,那么它们可能会被截断(因为十六进制编码的 sha-256 摘要是 64 个字符。

要推断出确切的情况需要一些工作。以下是您可以使用的不同方法。

  • 如果我可以访问原始源代码,我会查看它。考虑到您提出的问题,我认为这是不可能的。

  • 如果我可以将记录写入旧系统,我会设置一个哨兵密码(或找到一个我知道密码的帐户)。我知道的东西。然后我会从数据库中找到散列结果。

    所以现在我们知道p=passwordh=4d9e...

    从那里开始,只需使用 sha256 对密码进行哈希处理,然后看看你想出了什么。如果你很幸运,你会很快找到一个模式(就像哈希的后半部分刚刚被切断)。如果你不走运,这将需要一些挖掘和反复试验。

    所以,例如:

    p = "password"
    h = "5e884898da28047151d0e56f8dc6292773603d0d6aabbdd6"
    

    结果将是:sha256(p)[0:48] as sha256(p) == "5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8"

    h = "51d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8"
    

    结果将是:sha256(p)[16:48]

    等等。

  • 如果我无法访问已知密码,就无法验证假设。因此,如果您没有源代码,并且不知道系统中的帐户,那么您基本上就不走运了。因此,将前 2 项作为您的首要任务。

请注意,您可能需要发挥创造力。完全有可能发生了一些奇怪的事情。如:

salt = h[0:8]
tmp = sha256(p + salt)
h = salt + (tmp[0:16] xor tmp[16:16])

所以玩得开心:-)

【讨论】:

    猜你喜欢
    • 2011-10-15
    • 1970-01-01
    • 2012-12-31
    • 1970-01-01
    • 2011-03-02
    • 2020-11-15
    • 1970-01-01
    • 2011-03-27
    • 1970-01-01
    相关资源
    最近更新 更多