我需要允许网站的旧用户使用相同的凭据访问新网站。数据库服务器版本是 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=password
和h=4d9e...
。从这里开始,首先使用 sha256 对密码进行哈希处理,然后看看结果如何。如果幸运的话,您会很快找到一个模式(就像哈希值的后半部分被切断一样)。如果您不幸运,则需要进行一些挖掘、反复试验。
例如:
p = "password" h = "5e884898da28047151d0e56f8dc6292773603d0d6aabbdd6"
结果将是:
sha256(p)[0:48]
assha256(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/