- 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/
创建使用.NET框架的asp.net页面时,访问该页面的客户端是否需要在其计算机上安装.NET框架? IE。用户访问www.fakesite.com/default.aspx,如果他们没有安装框架,他
我阅读了很多不同的博客和 StackOverflow 问题,试图找到我的问题的答案,但最后我找不到任何东西,所以我想自己问这个问题。 我正在构建一个应用程序,其中有一个长时间运行的工作线程,它执行一些
已锁定。这个问题及其答案是locked因为这个问题是题外话,但却具有历史意义。目前不接受新的答案或互动。 我一直想知道为什么微软为这样一个伟大的平台选择了一个如此奇怪的、对搜索引擎不友好的名称。他们就
.Net Framework .Net .NET Standard的区别 1、.NET Framework 在未来.NET Framework或许成为过去时,目前还是有很多地方在使用的。这一套
如果有选择的话,您会走哪条路? ASP.NET Webforms + ASP.NET AJAX 或 ASP.NET MVC + JavaScript Framework of your Choice
我有一个 Web 服务,它通过专用连接通过 https 使用第三方 Web 服务,我应用了 ServicePointManager.ServerCertificateValidationCallbac
为什么我应该选择ASP.NET Web Application (.NET Framework)而不是ASP.NET Core Web Application (.NET Framework)? 我在
我在网络上没有找到任何关于包含 .NET Standard、.NET Core 和 .NET Framework 项目的 .NET 解决方案的公认命名约定。 就我而言,我们在 .NET 框架项目中有以
.NET Compact 是 .NET 的完美子集吗? 假设我考虑了屏幕大小和其他限制并避免了 .NET Compact 不支持的类和方法,或者 .NET Compact 是一个不同且不兼容的 GUI
我已经阅读了所有我能找到的关于 connectionManagement 中的 maxconnection 设置的文章:即 http://support.microsoft.com/kb/821268
我现在正在使用asp.net mvc,想知道使用内置的Json或 Json.Net哪个是更好的选择,但我不确定一个人是否比另一个人有优势。 另外,如果我确实选择沿用Json.Net的路线,那么我应该选
在 Visual Studio 中,您至少可以创建三种不同类型的类库: 类库(.NET Framework) 类库(.NET 标准) 类库(.NET Core) 虽然第一个是我们多年来一直使用的,但我
.NET 和 ASP.NET 之间有什么区别?它们有什么关系? 最佳答案 ASP.Net 基于 .Net 框架构建,提供有关 Web 开发的附加功能。 你可以去看看wikipedia article
在安装更高版本(3.0)之前,我需要安装.net框架1.1和2.0吗?或者单独安装 3.0 框架就足够了,并为在早期框架版本上编写的软件提供支持?谢谢 ,丽然 最佳答案 不,您不必安装以前的框架。 我
我正在开发一个项目,人们可以“更新”类别,例如更改类别的名称。我收到以下消息 This is called after clicking update 按钮 with the SQL statemen
.NET 类 System.Net.CookieContainer 线程安全吗? --更新:交 key 答复-- 是否有任何方法可以确保异步请求期间修改的变量(即 HttpWebRequest.Coo
我正在使用 JScript.NET 在我编写的 C# WinForms 应用程序中编写脚本。它工作得很好,但我只是尝试在脚本中放置一些异常处理,但我无法弄清楚如何判断我的 C# 代码抛出了哪种类型的异
我需要你的帮助, 比如我有一个小数类型的变量,我想这样取整。 例如 3.0 = 3 3.1 = 4 3.2 = 4 3.3 = 4 3.4 = 4 3.5 = 4 3.6 = 4 3.7 = 4 3.
我使用过这样的代码:http://msdn.microsoft.com/en-us/library/dw70f090.aspx在 ASP.NET 中工作之前访问数据库(2-3 年前)。我没有意识到我正
自 ConfigurationManager .NET Standard 中不存在,检索正在执行的程序集的应用程序设置的最佳方法是什么,无论是 web.config或 appSettings.{env
我是一名优秀的程序员,十分优秀!