在POST中加密数据

时间:2013-06-19 11:00:27

标签: javascript perl post encryption cgi

我想创建一种身份验证机制,其中客户端是JavaScript,它从客户端获取密码和用户名并将其发布到CGI Perl脚本。

问题是用户名和密码是自由文本。我想让它加密或散列,但在CGI我想检查它,所以我再次需要密码。

有什么想法吗?

3 个答案:

答案 0 :(得分:6)

您可能需要考虑使用https连接。这解决了您自己必须加密/解密数据的问题(但需要付出一些努力才能设置)。

答案 1 :(得分:3)

这是对建议客户端加密而不是HTTPS的评论的回应。


重要的是要考虑你在保护谁。

服务器端

如果数据库遭到入侵,服务器端散列对于购买时间非常重要。

从服务器/ CGI脚本的角度来看,您会收到某种形式的身份验证令牌,您想要验证它。

如果其他人可以访问明文数据库,则将令牌与存储的明文进行比较是危险的。如果其他人可以物理访问服务器,访问备份或者可以在服务器上运行软件,则这是不安全的。即使这样,错误的配置或未知漏洞也可能暴露明文密码。

因此,在服务器端发生某种(不可逆的)散列 。 MD5不是一个可行的解决方案。实际上,没有“快速”哈希(包括SHA算法)不再提供良好的保护:它们被优化用于快速和安全的完整性验证,而不是尽可能地使密码破解。这可以通过重复散列/键拉伸来缓解(参见WP article)。包含随机“盐”也很重要。不要在这里考虑“优化”。

运输

运输加密可以防止窥探者。

秘密访问令牌必须从客户端安全地传输到服务器。这通常通过HTTPS完成。

如果在客户端中对密码进行哈希处理,则哈希访问令牌实际上成为必须保护的密码。可视化:

      CLIENT       | TRANSPORT  | SERVER
                   |            |
password => HaShEd | >>>>>>>>>> | verification that “HaShEd” is valid.
                             ^  | never sees “password”.
  snooper can see “HaShEd”   |  |
  can make malicious request |>>|

这与未加密的密码没有什么不同。因此,任何预先散列的访问令牌都必须在传输过程中加密,例如,通过HTTPS。如果对密码使用可逆加密,则必须安全地传输加密密钥。这是一个解决了非对称加密的问题,但如果您只是使用HTTPS,则无需考虑所有这些,它会自动发生。

客户端加密

只有在想要保护服务器的机密时,才能在客户端进行加密。一个用例是将机密文件上传到服务器。如果它们在客户端加密,则服务器可能会受到危害,而不会损坏文件。对于身份验证,此不提供任何有用的功能

它所能做的就是以错误的安全感来平息用户。实际的秘密与用户知道的访问令牌不同。


除密码外,还可以使用无密码验证方案。其中最重要的是OpenID(与stackoverflow一起使用),您可以信任第三方身份提供商(例如Google,Facebook,GitHub)来对用户进行身份验证。你永远不会看到这个秘密,但只能从身份提供者那里得到是/否的消息。

答案 2 :(得分:2)

也许那就是你要找的东西:crypto-js 因此,您可以加密数据客户端并执行身份验证服务器。