我已经将ASP.NET MVC与实体框架(两者中最新的)一起使用来扩展现有网站的数据模型,但不更改用户帐户和用户身份验证。请将我指向其他文档或学习资源,随意回答这个问题。
我的问题是: ASP.NET如何处理通过线路传递用户凭据,验证这些凭据以及存储用户帐户凭据?而且,在保护前端,传输,处理和存储方面的信息方面,我自己如何手动完成?
前端 - 不知道,但确保表单已经过验证,我猜?这是用户的问题吗?
Transit - 使用加密协议(HTTPS?),但我不确定如何根据适当的控制器方法,视图和证书进行设置。
处理 - 将用户名/密码解密为明文,哈希并查找用户帐户表中的匹配记录,覆盖或确保明文变量不会出现在代码中。
存储 - 仅在数据库中存储用户名/密码的哈希值。
然后,一旦通过身份验证,创建将在某个时间到期的用户会话/密钥。再一次,我不确定如何做到这一点'手动'使用ASP.NET,但我知道它发生在内置/默认登录设置中。
答案 0 :(得分:4)
前端
数据不安全。在“密码”类型的输入中输入密码,该输入将对输入的信息进行模糊处理(防止过度风格攻击)。但是,纯文本值通过JavaScript公开,可以通过键盘记录程序或其他客户端恶意软件读取。关于这一点,你无能为力。最终,最终用户对其机器的安全性负责。
<强>交通强>
始终始终使用HTTPS。它不是万无一失的,就像最近的Heartbleed攻击所看到的那样,但它比通过HTTP发送所有纯文本都更好。除了像Heartbleed这样的基本缺陷,使用HTTPS,您只需要担心保护证书的密钥。 HTTPS使用秘密密钥和共享密钥进行双向加密。共享密钥被发送到客户端,允许它们加密它发送的内容但不解密,而密钥允许客户端发送的加密文本在服务器端被解密。因此,需要保护您的密钥。
就控制器操作而言,如果您只想对操作强制执行HTTPS,那么如果用户只能访问您的登录页面,例如https://domain.com/login
,而不是{{1} },你要添加属性http://domain.com/login
。可以在操作级别添加此属性以仅保护该操作,在控制器级别添加此属性以保护该控制器内的所有操作,或全局强制此属性以强制整个应用程序仅为HTTPS。
<强>处理强>
您不手动解密用户名/密码。如果您使用的是HTTPS,您的应用程序将由Web服务器传递已解密的值。在应用程序代码中处理纯文本不是问题,而且非常必要。我想如果你的服务器上运行的某些恶意软件可以访问内存中的IIS进程并在运行时将机器代码反编译成可以获取纯文本密码等的可用内容,那么就有可能利用它这个,但这是一个非常重要的黑客攻击,并且要求你的服务器已经严重受损。
<强>存储强>
当然,您只在持久存储中存储哈希值。这些是使用单向加密创建的,其中您有一个密钥,通常是一个随机的IV值。只要您不泄漏密钥和IV,就不可能将存储的值解密为原始字符串。攻击的唯一向量是冲突,您实际上以不同的方式加密数百万个不同的字符串,并检查与目标加密值的匹配。然而,大多数现代加密算法使得这种攻击几乎不可能,甚至需要数百甚至数千年的超级计算平台来创建可行的碰撞。只是停留在经常发出冲突的MD5上,并且整个黑帽数据库致力于将加密值与纯文本值进行匹配。