我们有一个旧的传统ASP应用程序,它将客户密码存储为salted MD5哈希值。我们在ASP.NET MVC中编写了一个新的应用程序来替换它。
我想将密码字段的保护提高一个档次并使用SHA1哈希。显然,我需要这样做而不强迫客户更新密码以创建新的SHA1哈希。
我的想法是使用SHA1散列现有的MD5哈希值。这意味着我仍然需要使用MD5进行哈希,然后在客户登录时再次使用SHA1进行哈希处理,并在重置密码时使用,但我可以使用它。
有人能发现这种方法有任何缺陷吗?对我来说似乎是
答案 0 :(得分:1)
您可以自动检测某些散列策略,例如直接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>