Passwords 值得在客户端对密码进行哈希运算吗
当我想建立一个登录系统时,我总是将给定密码的MD5与其在服务器端的users表中的值进行比较 然而,我的一位朋友告诉我,网络软件可以嗅出“清晰”的密码Passwords 值得在客户端对密码进行哈希运算吗,passwords,client-side,hash,Passwords,Client Side,Hash,当我想建立一个登录系统时,我总是将给定密码的MD5与其在服务器端的users表中的值进行比较 然而,我的一位朋友告诉我,网络软件可以嗅出“清晰”的密码 所以我的问题是:在客户端散列密码是个好主意吗?它比在服务器端散列好吗?基本上,你的朋友是对的。但是简单地在客户端对密码进行散列只比将其作为纯文本提交到服务器要好。能够监听您的纯文本密码的人当然也能够监听散列密码,并使用这些捕获的散列来对您的服务器进行身份验证 就这一点而言,更安全的身份验证协议通常会跳过许多障碍,以确保这种重放攻击无法工作,通常是
所以我的问题是:在客户端散列密码是个好主意吗?它比在服务器端散列好吗?基本上,你的朋友是对的。但是简单地在客户端对密码进行散列只比将其作为纯文本提交到服务器要好。能够监听您的纯文本密码的人当然也能够监听散列密码,并使用这些捕获的散列来对您的服务器进行身份验证 就这一点而言,更安全的身份验证协议通常会跳过许多障碍,以确保这种重放攻击无法工作,通常是通过允许客户端选择一组随机位,这些位与密码一起散列,并以明文形式提交给服务器 在服务器上:
- 生成一些随机数据
- 将这些位(以明文形式)发送到客户端
- 生成一些随机位
- 连接密码、服务器的随机位和客户端的随机位
- 生成上面的哈希
- 向服务器提交随机位(明文)和散列
编辑所有这些都是容易出错的、乏味的,而且有点难以纠正(请阅读:安全)。如果可能的话,考虑使用已经由知识渊博的人编写的认证协议实现(与我不同),以上仅仅是我以前读过的一本书的记忆。p> 你不必担心这一点——正如德克提到的,即使你对密码进行散列,恶意用户也可能在网络上看到散列被发送,并且自己也可能发送相同的散列 它稍微好一点,因为它可以防止恶意用户知道密码是什么,但由于他们仍然可以登录(或可能登录),所以这没有多大帮助 一般来说,如果您担心用户密码和数据的安全(您应该这么做!),那么您需要使用安全的SSL服务器。无论出于什么原因,如果这对你来说都不是一个问题,那么你最好不要费心于散列;只是
编辑2014年8月:谷歌正越来越强烈地要求网站提供信息,因为保护通信本身是防止网络嗅探攻击的唯一途径。试图混淆传输的数据只会阻碍而不是阻止专门的攻击者,并会给开发人员带来危险的虚假安全感。视情况而定,您可以使用客户端哈希,但服务器端salt是不可能的 看看这个链接
最近我在这方面做了很多工作,IRL客户端哈希/对称加密有两个问题,真的可以消除这个想法: 1.您必须以某种方式将salt返回到服务器…并且要在客户端对其进行加密,您需要一个密码…这与目的背道而驰。 2.您公开了您的哈希实现(这不是什么大问题,因为大多数站点使用3或4种哈希算法中的一种),这使得攻击更容易(因为只需要尝试一种而不是n) 我最终选择了使用OpenPGP.js或类似工具在客户端进行非对称加密。。。 这依赖于客户端和服务器上导入的或客户端生成的密钥发送公钥。只能将客户端的公钥发送回服务器。 这可以防止MIM攻击,并且与设备一样安全(我目前默认将客户端的私钥存储在localStore中,这是一个演示) 这样做的主要优点是,我不必在服务器/数据存储上存储用户数据/甚至不加密内存中的数据(并且服务器的私钥在物理上是分开的) 其基础是为人们提供一种在HTTPS受到限制的情况下安全通信的方式(例如,伊朗/北朝鲜atc…),这也是一个有趣的实验
我不是第一个想到这一点的人,使用这个如果有人能在你的连接上看到进出的数据,那么身份验证将不会保存你。 相反,我会为超级秘密的东西做以下事情 在发送到服务器之前,密码会在客户端预灰化。 (服务器存储从浏览器发送的该散列的另一个散列值和附加值) 因此,中间人攻击可以允许他们发送与他们相同的哈希值登录,但用户密码未知。这将阻止他们尝试使用相同凭据的其他服务登录其他地方 用户数据也在浏览器端加密 啊,所以中间人攻击会得到加密的数据,但如果没有登录时使用的实际密码,就无法解密。(用户登录时,密码存储在浏览器上的DOM中)。 因此,真正的用户会看到解密的内容,但中间人看不到。 这也意味着任何国家安全局或其他机构将无法要求您/公司/托管提供商解密这些数据,因为他们也不可能这样做 我的博客上有这两种方法的一些小例子
实际上,我不同意客户端哈希在这种情况下更安全。我觉得不太安全 关键
(SHA256(SHA256(password)+salt))
RSA_With_Public_Key(SHA256(password))
if SHA256(RSA_With_Private_Key(SHA256(sent_password))+salt_for_username) == stored_pass: login = ok