支持在遗留数据库上构建的新系统的安全性

时间:2011-01-08 22:53:28

标签: security passwords hash

我们有一个旧的传统ASP应用程序,它将客户密码存储为salted MD5哈希值。我们在ASP.NET MVC中编写了一个新的应用程序来替换它。

我想将密码字段的保护提高一个档次并使用SHA1哈希。显然,我需要这样做而不强迫客户更新密码以创建新的SHA1哈希。

我的想法是使用SHA1散列现有的MD5哈希值。这意味着我仍然需要使用MD5进行哈希,然后在客户登录时再次使用SHA1进行哈希处理,并在重置密码时使用,但我可以使用它。

有人能发现这种方法有任何缺陷吗?对我来说似乎是

2 个答案:

答案 0 :(得分:1)

  1. 加宽列以支持哈希
  2. 引入第二列来确定哈希策略(或参见下文);默认为MD5(因为那是当前的哈希)
  3. 更改登录(和类似)和密码更改/重置例程,以根据此值检测正在使用的哈希策略,然后应用它;如果使用“已弃用”哈希值对值进行哈希处理,则以静默方式对其进行哈希处理(因为一旦您对其进行了验证,您将获得用户的纯文本密码)
  4. 经过一段合理的时间后,请考虑锁定未升级旧密码哈希的用户
  5. 可以自动检测某些散列策略,例如直接MD5与SHA1,基于其编码输出的长度 - 十六进制编码的MD5占用32个字节,而SHA1需要40个。但是,“哈希策略”还可以包含信息(对应用程序有意义 - 确保您彻底记录它!关于对散列执行的任何其他操作,例如salting机制,或散列迭代次数,并且通常更加健壮。将来,您可能需要引入第三个哈希值(比如Tiger-192)并重复升级过程。

    如果你不能省去另一列,那么扩大现有的列以支持带有哈希的一些指示符的前缀,例如: {SHA1}xxxxxxxxxxxxx - 旧哈希不会加前缀,可以假定为MD5。

答案 1 :(得分:1)

您应该使用Bcrypt或类似的东西,而不是使用SHA1。

但是否则你的计划似乎是合理的。幸运的是,现有的哈希值具有易于识别的格式,因此如果您不想向数据库添加新列,则可以添加标识符前缀。

我建议更改代码以便能够处理md5,md5 + bcrypt或bcrypt,然后你可以运行后台进程将密码从md5升级到md5 + bcrypt,而在线登录代码升级到bcrypt?< / p>