如何使用bcrypt比较迁移数据的旧密码?

时间:2017-12-28 10:43:48

标签: sql-server node.js hash sha1 bcrypt

我最近使用Pentaho ETL工具将我的用户表从SQL Server迁移到Mongodb。密码字段是二进制数据类型,但是我使用bycrypt在Nodejs中为所有新用户创建哈希密码,那么如何将我的旧用户密码与bcrypt进行比较,因为它是使用SQL Server加密的?

以下是SQL Server密码示例:

  

0x010000008F0985DA84A7F12633E8EF1AA121A0AE6FB0F4049F9BDDAF326045AA8F5F6AF7

3 个答案:

答案 0 :(得分:2)

通常,密码哈希算法将包含一个salt,正如Markus所指出的,SQL Server使用SHA系列哈希算法。前面的useful link supplied显示使用SHA1对以0x0100开头的哈希值进行哈希处理。

此外,SQL Server似乎使用了一个salting系统,非常正确。这样做的目的是确保即使彩虹表可用于特定的散列算法,添加这个额外的随机混淆意味着每行需要自定义彩虹表,这与需要强行每行而不需要预计算帮助。

Salts倾向于合并为哈希值,但它们本身并不是秘密,因此可以简单地提取它们。所以,一切都不会丢失 - 这就是你需要做的事情:

首先在Mongo中实现旧算法

  • 使用上面的链接确定此字段的哪个部分是哈希,哪个部分是盐。
  • 使用SQL Server开始,您应该能够根据此算法重新创建哈希值:

    hash = algorithm(password + salt)
    

    当然,您需要知道密码的行,但您可以为此创建一个虚拟行。

  • 然后,一旦您解决了这个问题,请将每行的哈希值和salt值复制到Mongo数据库
  • 在Mongo和/或Node
  • 中重新创建SQL Server代码
  • 在每个Mongo用户文档中添加新值以表示您正在使用的算法(可能是sha1

下次看到密码时将用户转移到新算法

  • 当用户登录到您的新系统时,他们将提供密码,您可以根据算法列查找要执行的测试。
  • 如果他们成功登录并且他们有旧算法,请根据Bcrypt重新创建哈希值,然后将算法值更改为bcrypt

我将把提取哈希和盐的具体任务留给读者练习。看起来它无论如何都在提供的链接中拼写出来。

答案 1 :(得分:0)

您是否在询问如何解密从SQL Server sys.syslogins表中获取的密码?如果是这样,答案很简单:你不能。这些密码是经过哈希处理的,我非常确定它们也会被腌制(对于每个版本的SQL Server,为了增加安全性,可能使用不同的算法盐)。你不能解密它们;他们的设计使他们无法成为。

答案 2 :(得分:0)

你无法做你想做的事。您不能只更改现有网站的哈希算法;你必须继续支持旧算法,直到所有用户自你引入新算法后至少登录一次,让你有机会重新哈希他们的密码(这通常是永远不会,除非你最终决定停用帐户长时间没有登录的用户。)

您需要做的是重新实现SQL Server密码哈希算法,以便您可以继续使用它来验证现有用户的密码,然后使用bcrypt重新哈希其密码并保存新哈希。这对您来说可能是不可能的,在这种情况下,您可以选择迁移回SQL Server或为所有用户执行强制密码重置。