.net Castle ActiveRecord/NHibernate-密码加密或哈希

.net Castle ActiveRecord/NHibernate-密码加密或哈希,.net,nhibernate,castle-activerecord,password-storage,.net,Nhibernate,Castle Activerecord,Password Storage,使用不希望以明文形式存储在数据库中的密码的正确方法是什么?我在NHibernate/Castle ActiveRecord中有哪些选项 更新: 我对其他人如何使用NHibernate/Castle ActiveRecord处理这个问题感兴趣。 如果NHibernate或Castle ActiveRecord中内置了任何东西。您应该加密或散列密码。当然,散列更安全一点,这取决于算法。因为它是无法逆转的;但是,由于您可以使用“检索密码”选项,因此加密功能更强大。使用哈希,您必须生成一个新密码 至于n

使用不希望以明文形式存储在数据库中的密码的正确方法是什么?我在NHibernate/Castle ActiveRecord中有哪些选项

更新: 我对其他人如何使用NHibernate/Castle ActiveRecord处理这个问题感兴趣。
如果NHibernate或Castle ActiveRecord中内置了任何东西。

您应该加密或散列密码。当然,散列更安全一点,这取决于算法。因为它是无法逆转的;但是,由于您可以使用“检索密码”选项,因此加密功能更强大。使用哈希,您必须生成一个新密码


至于nHibernate/castle,您应该在业务对象内部处理算法,而不是与持久性机制分离。

最好的方法是使用用户类型。实现透明密码加密的


我将把这样的常见问题复制到。散列密码。不要加密-这很复杂和/或不安全。在任何情况下,在普通的业务线应用程序或网站中,根据其他可验证的标准重置密码都是可行的。我不确定你是否熟悉散列密码的原理,所以我将从基础知识开始解释

当用户最初选择密码时,对文本运行单向哈希算法。这将生成一个签名-如果您将相同的字符串输入到哈希算法中,将始终生成该输出。关键是您无法从哈希返回密码,因此是单向的。然后存储哈希,而不是密码。当用户返回时,他们必须再次输入密码,您可以使用相同的算法对此进行散列,并将结果值与数据库中的值进行比较-如果它们匹配,您知道用户再次输入了相同的字符串,但您仍然不知道或需要知道它是什么。这比基于加密的解决方案安全得多,在加密方案中,如果知道密钥,则始终可以恢复明文,根据定义,服务器必须知道密钥才能验证密码输入

在.NET中散列字符串的一种简单方法是使用System.Web.Security.FormsAuthentication.HashPasswordForStoringInConfigFile,尽管它的名称很长,但它是为使用ASP.NET表单身份验证的用户提供的一个简单函数,但在其他地方同样有用。您可以将MD5或SHA1指定为您的哈希算法,或者如果将来的框架版本支持,可以指定其他哈希算法。我推荐SHA1,因为众所周知MD5有弱点,但SHA1可能也有弱点

然而,这个方案有一个缺陷。如果多个用户选择相同的密码,他们将具有相同的哈希。如果黑客能够访问您的数据,他们可以对公共字符串进行暴力攻击,并将其与存储的数据进行比较。如果他们被击中,他们已经破解了所有使用该密码的帐户。由于用户倾向于选择蹩脚的密码,并且讨厌被要求选择他们记不住的安全密码,这使得基于简单密码哈希的系统有点脆弱

你应该做的是给肉馅加盐。这仅仅意味着在原始数据(密码)前面加上一个随机字符串或加上后缀。这种盐需要尽可能随机,长度至少有几个字符,我建议至少5个字符,最好是随机长度。您将未模糊的salt存储在DB中的一列中,与哈希salt+密码组合一起。当用户返回时,您将以相同的方式在其输入中添加盐的前缀或后缀,然后像以前一样进行哈希比较

这会降低暴力攻击的有效性,因为即使每个用户拥有相同的密码,他们也应该拥有不同的哈希。您可以安全地将salt存储在DB中,因为当您知道某个字符串时,从其散列中计算该字符串与不知道该字符串时一样困难,如果密码本身比salt长,足够长,足够强,可以用蛮力破解至少6个字符,至少有一个大小写更改和一个数字或非字母数字,我会说


如果有人无限期地访问您的数据,他们最终会破解散列密码。但最终可能是几个月或几年。如果您知道自己已被泄露,您可以在每个人的密码出现问题之前很好地更改密码。

我建议不要使用UserType进行单向哈希,除非您有一个计划,可以防止在后续调用NullSafeSet时不断重新设置哈希密码


相反,我建议您在Password属性上使用backing字段,在setter中应用hash方法,并设置映射以使用字段访问。

很抱歉,这可能与您的密码无关,但我希望可以帮助其他人

使用 uNhAddins是我找到的最简单的方法,你只需要关心HBM就行了

检查这个


希望您能提供帮助

+1谢谢您的宝贵信息。不过我要更新我的问题。我在想加密/散列应该如何与NHibernate和CAR一起工作。但是其他人应该根据散列和安全性的解释对此进行投票。是的,重点是——Mausch在上面的回答告诉你NHibernate如何通过用户类型处理透明加密。因为散列是单向的,所以我不知道NHibernate和AR中对它有什么具体的支持。即使是作为一个NH的大用户,我也总是在域对象中这样做。