2009-10-01 99 views
1

我从迁移ColdFusion的到ASP.Net MVC应用程序,并有一个小问题,我似乎无法左右我的头。原始应用程序将数据库中的用户密码存储在MD5散列格式中,不含salt。我正在使用ASP.Net会员店,并希望尽可能为现有用户提供无缝过渡。这是我正在考虑的可能性...设置会员店密码

1)由于我无法解密他们当前密码的值,我正在考虑将这个旧密码存储在表中,在登录时检查它是否...如果它不是空和他们的密码匹配,我提示他们更新他们的密码,然后它将在asp.net会员表中正确设置密码并清除旧密码,永不再次检查。

2)用户登录他们的电子邮件,而不是他们的网名,所以我想他们的网名重置每个人的密码,并迫使他们首次登录后更改的。唯一的问题是,我不知道我可以通过SQL更新他们的密码,而不需要当前的密码。执行aspnet_Membership_SetPassword proc似乎不会自己加密密码。

你说什么?

回答

2

我在现场应用中使用的#1变体。它运作良好,用户从未注意到我所知道的变化。

几个改进的:

  • 你并不需要提示他们更新自己的密码;他们为您提供了登录的明文(并且您知道这是正确的明文,因为它正确哈希),所以请继续并将其设置为密码。
  • 如果他们使用密码重置功能,请确保您清除旧密码散列。

我会在任何情况下使用选项2;这是非常不安全的。

另外一件事 - 可以在不知道当前密码的情况下设置密码,它只需要两个步骤。

  1. 重置用户的密码。您现在知道重置密码。
  2. 使用新设置的密码将密码设置为已知值。
2

我也有类似的情况recently-我的一个老的应用程序使用的腌MD5,我非常想在不影响我的用户升级。我最终做的是将原始哈希包装在一个更好的哈希中,然后重新腌制它以减轻分辨率的损失。

例如我最初的哈希值是MD5(通+盐)

我升级一切SHA256(MD5(通+盐)+盐) - 这样我的应用程序是安全的,我从来没有需要找出原始密码或重置任何东西。

一旦新的认证过程是否到位了简单的数据库中的所有现有用户运行更新脚本。这有点痛苦,但对用户来说实质上是无缝的。

-

Bah-我道歉,这不是真的,因为我用我的应用程序自定义的身份验证类针对ASP.net成员。我仍然认为这是执行升级更健全的方法之一,但我不确定ASP.net会员详细信息。

+1

是的,ASP.NET并没有给你太多的控制权限在默认提供程序中进行散列;不过,您可以轻松地在自定义会员提供商中完成此操作。有趣的解决方案。 – technophile 2009-10-01 16:19:16

0

选项2是一个相当大的安全风险。如果有人知道在合适的所有者登录之前,屏幕名称的电子邮件可能会记录劫持该帐户。知道或猜测最受欢迎的网站用户(即最诱人的劫持人员)的电子邮件可能比您想象的更普遍。