我想创建一个安全登录,所以我想在将密码作为 POST 参数发送之前对其进行加密。我正在使用 SHA1 javascript 函数进行操作。
然后我意识到如果有人截获了加密密码,他可以立即使用它。将其作为 post 参数发送到相同的 URL。
如何确定密码来自登录输入字段?也许有一个 PHP 会话?我还不想使用安全 http。任何人都有一个简单的选择?
我想创建一个安全登录,所以我想在将密码作为 POST 参数发送之前对其进行加密。我正在使用 SHA1 javascript 函数进行操作。
然后我意识到如果有人截获了加密密码,他可以立即使用它。将其作为 post 参数发送到相同的 URL。
如何确定密码来自登录输入字段?也许有一个 PHP 会话?我还不想使用安全 http。任何人都有一个简单的选择?
如何确定密码来自登录输入字段?
你不能。
与此最接近的是针对CSRF的通常防御措施……但这只会阻止人们欺骗用户将数据从他们的站点提交到您的站点。它不会保护密码。
我还不想使用安全 http。任何人都有一个简单的选择?
HTTPS是一个简单的选项。
唯一可能对您有所帮助的是为每个会话创建临时盐,然后在客户端加密密码,然后使用保存在服务器端的相同盐解密密码,该方法就像用于的唯一令牌防止 CRSF,因为即使是中间人也捕获了他/她无法解密的密码。
最后,您需要创建另一个(不同的算法)来将密码保存在数据库中,上面的概念思想是用于保护客户端和服务器之间的密码。
解释:
客户端 -> 请求 -> 服务器
服务器 -> 响应(发送唯一的盐或用于 JavaScript,如 session_id()) -> 客户端
客户端 -> JavaScript 执行 -> 使用唯一盐加密密码
客户端 -> POST -> 服务器
服务器 -> 使用保存的盐解密密码 -> 提取密码
如果上面的想法是错误的,我希望有人纠正我!
注意:AES 可用于 JS 和 PHP
盐=钥匙
可用工具:
通过网络将 SHA1 密码发送到您的服务器可以有效地使 SHA1 哈希成为真正的密码。
除了没有优势之外,您实际上正在使您的安全性变得更糟;如果我用 SHA1 哈希窃取你的数据库,我现在可以直接使用这些登录,甚至无需暴力破解哈希来获取“真实”密码。
HTTPS 是保护密码不以纯文本形式发送的唯一真正方法。当您传输到 HTTPS 时,请确保将这些 SHA1 哈希值更改为 bcrypt。
如果您担心额外的 SSL 证书费用,您也可以生成自签名证书,如果您不担心浏览器错误或愿意将证书添加到受信任列表 ( http://resources.arcgis.com ) /en/help/main/10.1/index.html#//0154000005q6000000)。
请帮全世界和您的所有客户一个忙,并继续加密密码,然后再通过未加密的 HTTP 发送密码。
这个问题有两个方面,在这种情况下,两个方面是您自己和您所服务的客户。不幸的是,大多数人在许多网站上使用相同的密码,事实是我们没有存储容量来处理我们使用数百个密码登录的数百个网站,我们作为最终用户选择两个或三个并继续我们的生活。如果您通过 HTTP 向您的客户发送密码而不首先对其进行加密,那么您肯定是做错了,事实上您会有所收获。相信您的客户,他们的密码(可能与他们登录银行时使用的密码相同)不会落入黑客之手,更重要的是,不会落入与网站开发相关的任何人之手,因为,
我不愿意想到有多少 Web 开发人员阅读了这篇文章并决定在客户端加密,这应该是我们要做的第一件事,这是对用户的保护,而不是你自己......可以保护你的数据库有大量的程序,每个安全分析师都有自己的看法,不管该做什么或不该做什么。不应讨论客户端加密。