Security 网站登录:如何将用户凭据发送到服务器进行验证?

Security 网站登录:如何将用户凭据发送到服务器进行验证?,security,encryption,login,passwords,Security,Encryption,Login,Passwords,我正在从事一个项目,其中远程客户端需要登录到Web服务器。我不是在寻找任何特定语言的例子;只是对所涉及的安全问题的总体看法 基本问题是: 如何将用户凭据传递给Web服务器进行验证? 我正在描绘你典型的网站登录。一个字段表示用户名,另一个字段表示密码。您可以同时键入这两个,然后单击“登录”。接下来会发生什么 我可以想象几个场景: 凭据以纯文本形式发送到服务器。服务器端脚本创建密码哈希,并将其与用户存储的哈希进行比较 凭据在本地加密,并将结果发送到服务器。服务器解密凭据并继续,如#1所示 我还没想到

我正在从事一个项目,其中远程客户端需要登录到Web服务器。我不是在寻找任何特定语言的例子;只是对所涉及的安全问题的总体看法

基本问题是:
如何将用户凭据传递给Web服务器进行验证?

我正在描绘你典型的网站登录。一个字段表示用户名,另一个字段表示密码。您可以同时键入这两个,然后单击“登录”。接下来会发生什么

我可以想象几个场景:

  • 凭据以纯文本形式发送到服务器。服务器端脚本创建密码哈希,并将其与用户存储的哈希进行比较
  • 凭据在本地加密,并将结果发送到服务器。服务器解密凭据并继续,如#1所示
  • 我还没想到的事?我是新来的。对我放松点 选项#1给我的印象是很弱,因为凭证是以明文形式通过互联网发送的

    我认为方案2并不比方案1好多少。如果有人截取了加密的凭据,他们是否可以在下次将这些凭据发送到服务器,然后仍然设法登录

    任何见解都值得赞赏


    编辑:侧边栏中的“相关”提示,其中提到了客户端/服务器握手,并在密码中添加了盐。这是正确的方法吗?

    选项1是默认的。明文的弱点通常是通过在登录期间强制使用SSL来克服的,这样密码在传输期间至少是加密的

    编辑:我建议您按照公认的答案回答这个问题

    别忘了为你的要求提供一份书面答复。这将有助于防止重播攻击

    编辑第二个:Wayne深思熟虑地提到,在散列之前,您应该输入密码。以下是一些基本提示:

  • 不管你的salt是前缀、后缀还是中缀
  • 你的盐应该是大的、随机的、复杂的
  • 你的盐应该是唯一的每盐值。盐本身不需要加密
    为什么不使用SSL通信?能够观察对话让我深入了解你的应用程序。加密整个通信,而不仅仅是凭据


    编辑:始终对本地存储的哈希使用salt。Windows继续失败,因为强制使用本地哈希密码,因为默认情况下,这些密码不含盐。

    在客户端,您只有一个可以呈现HTML和提交表单的浏览器。谁来加密东西


    以明文形式发送登录名和密码(如果您有问题,请使用SSL)。在服务器端,您可以对其执行任何操作(最好在将其存储到数据库之前使用哈希和salt密码)。

    最简单的答案是为您的服务器获取SSL证书。在这个特定的应用程序中创建自己的加密技术真的没有理由乱来。正如您所注意到的,如果连接未加密,则无论客户机或服务器是否正在进行密码加密,您都会受到中间人攻击。加密连接,你不必担心它。

    你可能还想考虑使用哈希算法的多次迭代,1000次迭代会很好地减缓事情,使彩虹表更难创建

    技术上是否属于选项2?那么,我想这取决于你如何阅读它。我把选项2理解为使用某种客户端javascript加密,然后以明文形式发布加密密码。谢谢你链接到nonce文章。我以前从未听说过:)这是老斯库尔,但我最近才知道。我设法在最长的时间内避免了安全编程的需要…使用nonce是否需要服务器以明文形式存储密码?我不知道它如何将散列(nonce+cnonce+password)与其他东西进行比较,除非它也能够计算散列(nonce+cnonce+password)。是的,我忘了在散列之前提到salting+1,是时候编辑了。@Jim Puls:谢谢您的编辑。我还在为“韦斯比特”自嘲:)韦斯比特。听起来像是圣:TNG的一集。。。哦,天哪。我很惭愧我得到了那个。