我最近使用Pentaho ETL工具将我的用户表从SQL Server迁移到Mongodb。密码字段是二进制数据类型,但是我使用bycrypt在Nodejs中为所有新用户创建哈希密码,那么如何将我的旧用户密码与bcrypt进行比较,因为它是使用SQL Server加密的?
以下是SQL Server密码示例:
0x010000008F0985DA84A7F12633E8EF1AA121A0AE6FB0F4049F9BDDAF326045AA8F5F6AF7
答案 0 :(得分:2)
通常,密码哈希算法将包含一个salt,正如Markus所指出的,SQL Server使用SHA系列哈希算法。前面的useful link supplied显示使用SHA1对以0x0100
开头的哈希值进行哈希处理。
此外,SQL Server似乎使用了一个salting系统,非常正确。这样做的目的是确保即使彩虹表可用于特定的散列算法,添加这个额外的随机混淆意味着每行需要自定义彩虹表,这与需要强行每行而不需要预计算帮助。
Salts倾向于合并为哈希值,但它们本身并不是秘密,因此可以简单地提取它们。所以,一切都不会丢失 - 这就是你需要做的事情:
使用SQL Server开始,您应该能够根据此算法重新创建哈希值:
hash = algorithm(password + salt)
当然,您需要知道密码的行,但您可以为此创建一个虚拟行。
sha1
)bcrypt
。我将把提取哈希和盐的具体任务留给读者练习。看起来它无论如何都在提供的链接中拼写出来。
答案 1 :(得分:0)
您是否在询问如何解密从SQL Server sys.syslogins
表中获取的密码?如果是这样,答案很简单:你不能。这些密码是经过哈希处理的,我非常确定它们也会被腌制(对于每个版本的SQL Server,为了增加安全性,可能使用不同的算法盐)。你不能解密它们;他们的设计使他们无法成为。
答案 2 :(得分:0)
你无法做你想做的事。您不能只更改现有网站的哈希算法;你必须继续支持旧算法,直到所有用户自你引入新算法后至少登录一次,让你有机会重新哈希他们的密码(这通常是永远不会,除非你最终决定停用帐户长时间没有登录的用户。)
您需要做的是重新实现SQL Server密码哈希算法,以便您可以继续使用它来验证现有用户的密码,然后使用bcrypt重新哈希其密码并保存新哈希。这对您来说可能是不可能的,在这种情况下,您可以选择迁移回SQL Server或为所有用户执行强制密码重置。