- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个使用 SqlMembershipProvider
的 ASP.NET 4.5 Web 应用程序。在开发过程中,有人将 passwordFormat="Clear"
放入配置中,导致密码以明文形式保存。我想删除它并启用密码散列,但我想确保散列不是使用特定于机器或自动生成的 key 生成的。
根据我在所有相关问答中所读到的内容,密码只是使用直接 SHA256 进行哈希处理,而不是特定于机器或 key 的。但是,当我在运行时检查 Membership.HashAlgorithmType 时,它的值为“HMACSHA256”和 .NET HMACSHA256
class需要一个 key (因为它是 HMAC),如果没有提供给构造函数,则随机生成一个。所以看来一定有一把 key 参与其中。那么成员(member)密码哈希值是否加密?如果是,我如何跨机器使用相同的 key ?支持您的回答的文档或证据将不胜感激。
编辑
根据 this MSDN page on "Securing Membership" ,machineKey 元素确实控制哈希键:
It is highly recommended that you encrypt user passwords in the membership data source using a passwordFormat attribute set to Hashed or Encrypted, where Hashed is the most secure format. The encryption key values for the specified encryption algorithm are stored in the machineKey configuration element.
但是,我尝试在 web.config 中设置机器 key 验证 key ,它仍然生成与设置之前相同的密码哈希,所以它似乎没有效果。
我也一直在看 SqlMembershipProvider source code据我所知,它确实使用了键控哈希。当然这是 .Net 4.6.1 的来源,我正在运行 4.5。我已经复制了 EncodePassword
源代码并对其进行了修改,以便它可以在控制台应用程序中运行,而在我的控制台应用程序中,我仍然得到与 MembershipProvider 结果(在同一台机器上)不同的哈希值密码和盐值。
如果它使用随 secret 钥,您将无法验证密码。那么 SqlMembershipProvider 从哪里得到它的哈希键呢??
最佳答案
在深入研究源代码和在线之后,我在 SO 上发现了一个问题,用户注意到了他/她的 SQLMembershipProvider
哈希值在数据库中只有 20 个字节。他们应该是 64 岁。我检查了我的,他们也是。我试图确定 SHA256 哈希如何最终只有 20 个字节,并得出它不能的结论。所以在我的控制台应用程序中,我尝试只使用 SHA1 来解决这个问题。我将其结果与 SQLMembershipProvider
创建的哈希进行了比较果然,它匹配了!我的SQLMembershipProvider
尽管 Membership.HashAlgorithmType
仍在使用 SHA1表示它设置为 .NET 4.0 默认值“HMACSHA256”。
这是我阅读源代码派上用场的地方。我记得我从我的控制台应用程序中删除了一个条件部分,它在创建哈希算法类时检查某些遗留模式。
private HashAlgorithm GetHashAlgorithm() {
if (s_HashAlgorithm != null)
return HashAlgorithm.Create(s_HashAlgorithm);
string temp = Membership.HashAlgorithmType;
if (_LegacyPasswordCompatibilityMode == MembershipPasswordCompatibilityMode.Framework20 &&
!Membership.IsHashAlgorithmFromMembershipConfig &&
temp != "MD5")
{
temp = "SHA1";
}
HashAlgorithm hashAlgo = HashAlgorithm.Create(temp);
if (hashAlgo == null)
RuntimeConfig.GetAppConfig().Membership.ThrowHashAlgorithmException();
s_HashAlgorithm = temp;
return hashAlgo;
}
经过更多挖掘,我确定了 _LegacyPasswordCompatibilityMode
从名为 passwordCompatMode
的配置属性中设置这属于 SqlMembershipProvider
,即使它没有出现在 web.config 的智能感知中。一旦我明确设置 passwordCompatMode="Framework40"
在 SqlMembershipProvider
上在我的 web.config 中,我的散列开始使用键控 HMACSHA256 散列,其中键是 machineKey 的 validationKey。使用相同的验证 key ,然后我能够从我的控制台应用程序中重现相同的哈希值。
作为问题的确认,当我删除 passwordCompatMode="Framework40"
属性,然后在调试器中检查 SqlMembershipProvider
的一个实例,我可以看到:
_LegacyPasswordCompatibilityMode = "Framework20"
s_HashAlgorithm = "SHA1" (!!!)
这就是疯狂的事情。 SqlMembershipProvider 上的 MSDN 文档状态:
The default value [for passwordCompatMode] is Framework20.
所以除非你明确声明这个晦涩的属性为Framework40
, SqlMembershipProvider
尽管 4.0 框架被宣传为升级到 HMACSHA256,但仍使用 SHA1。很难找到推断 key 来自 machineKey 部分的文档……该死的,甚至很难发现 4.0 使用 HMACSHA256,而不仅仅是 SHA256……但我没有看到其他任何地方说明此属性是必需的。我想知道有多少开发人员认为他们使用的是更安全的 HMACSHA[X],而实际上他们仍然只使用 SHA1?希望这对人们有所帮助。
编辑
如果 <membership>
以上为真元素未明确声明 hashAlgorithType
.您可以在上面的 .NET 源代码中看到它查找 !Membership.IsHashAlgorithmFromMembershipConfig
。这表明它是否找到了 hashAlgorithmType
membership 元素上的属性。因此,如果您指定 <membership ... hashAlgorithmType=[x]>
在你的配置中,我相信它不需要 passwordCompatMode
SqlMembershipProvider 上的属性。
关于c# - ASP.NET 成员资格 HashAlgorithmType 默认为 HMACSHA256,那么密码散列是键控的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34273233/
Internal Server Error: /admin/account/customuser/add/ Traceback (most recent call last): File "C:\
有问题!虽然我发现几乎相似的线程但没有帮助:( 我编写了一个 php 脚本来从我的 MySQL 数据库中获取注册用户的数量。该脚本在我的本地主机上运行良好;它使用给定的用户名、密码和主机名,分别是“r
我正在做一项基于密码的作业,我将 key 和消息放在单独的数组中。我想创建第三个数组,其中包含围绕消息大小的 key ,如下所示: message keykeyk 我已经在这个问题上苦苦挣扎了一段时间
我的几个客户要求我实现图形密码检查器,例如 关于如何实现这种 UI 有什么想法吗? 最佳答案 试着看看这个:https://code.google.com/p/android-lockpattern/
我正在使用 MAMP,每次登录 phpMyAdmin 时,都会收到以下错误/警告消息: the configuration file now needs a secret passphrase (bl
我正在尝试通过将 Visual Studio 2013 连接到我的测试机来调试 WDF 驱动程序。它创建一个名为 WDKRemoteUser 的用户,并在进行测试时尝试自动登录。有人知道这个用户的密码
使用具有指定用户名和密码的 SVN 提交。我希望服务器抛出错误;所以我可以告诉我的用户他/她的密码错误。 相反,在使用错误密码提交后: svn commit "test_file.txt" --use
我正在尝试实现 friend 推荐。 它从节点“你”开始。而且,我想找到节点“安娜”。 换句话说,这是我的两个或更多 friend 共同认识的人。上面的示例节点是 Anna。 如果您的帮助,我将不胜感
我都尝试过 wget --user=myuser --password=mypassword myfile 和 wget --ftp-user=myuser --ftp-password=mypass
我的一位用户提示说,每当他尝试使用默认管理界面(Django 的管理员)添加新用户(auth.User)时,新用户名和密码都会自动填充他自己的。 问题是他在登录时要求 Firefox 记住他的用户名/
我们正在开发一款应用(当然)用于应用购买 (IAP)。我已完成指南中的所有操作以启用 iap,并且一切正常,直到我想要购买为止。 部分代码: MainViewController.m -(vo
我试图创建两个可选匹配项的并集(如下所示),但我得到的不是并集,而是两者的交集。我应该如何更改此查询以获得所需的联合? optional match (a:PA)-[r2:network*2]-(b:
我想将Ansible用作另一个Python软件的一部分。在该软件中,我有一个包含其用户名/密码的主机列表。 有没有一种方法可以将SSH连接的用户/密码传递给Ansible ad-hoc命令或以加密方式
嗨,我在使用xampp的Apache Web服务器上收到错误500。直到我使用.htaccess,.htpasswd文件,错误才出现。我搜索了,但找不到语法错误。我只有1张图片和要保护的索引文件。以下
我一直使用它来编辑用户帐户信息: $this->validate($request, [ 'password' => 'min:6', 'password_confirmation'
我需要使用InstallUtil来安装C# Windows服务。我需要设置服务登录凭据(用户名和密码)。这一切都需要默默地完成。 有没有办法做这样的事情: installutil.exe myserv
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a software
如果我有一个随机的、16 个字符长的字母数字盐(不同大小写),它是为每个用户生成和存储的,我是否还需要一个站点范围的盐? 换句话说,这样好吗? sha1($user_salt . $password)
我正在开发一个空白程序,该程序将允许用户创建一个帐户,以便他们可以存储其余额和提款/存款。用户输入用户名和密码后,如何存储这些信息以便用户可以登录并查看其余额?我不一定要尝试使其非常安全,我只是希望能
我正在尝试寻找一种通用方法来搜索没有链接到另一个节点或节点集的节点或节点集。例如,我能够找到特定类型(例如 :Style)的所有节点,这些节点以某种方式连接到一组特定的节点(例如 :MetadataR
我是一名优秀的程序员,十分优秀!