java - SHA-256 自定义长度摘要

标签 java sql-server security sha sha256

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

最佳答案

native 输出大小为 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])

祝你玩得开心:-)

关于java - SHA-256 自定义长度摘要,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29604301/

相关文章:

java - 使用 Java 删除锁定的文件?

c-String 漏洞

java - 在 Java Swing 中,如何获得对窗口的 Win32 窗口句柄 (hwnd) 引用?

java - 如何修复此 Try-With-Resources block 中出现的 "SQLServerException: The connection is closed."问题?

sql - SQL Server 2005 的首选合并方法是什么?

c# - 具有排名和唯一用户的高分

mysql - 如何使用 INSERT INTO OPENQUERY SELECT 将日期时间从 mssql 插入 mysql

java - WSSecurityException - 处理 <wsse :Security> header 时发现错误

javascript - 如何添加 X-XSS-Protection : 1; mode=block HTML

java - 存储库模式 : Can a repository use other repositories?