Javascript 在POST中加密数据

Javascript 在POST中加密数据,javascript,perl,post,encryption,cgi,Javascript,Perl,Post,Encryption,Cgi,我想创建一个身份验证机制,其中客户端是JavaScript,它从客户端获取密码和用户名,并将其发布到CGI Perl脚本中 问题是用户名和密码是自由文本。我想让它加密或散列,但在CGI我想检查它,所以我需要再次密码 有什么想法吗?也许这就是你想要的: 所以你可以加密你的数据客户端并做验证服务器端。 你可能想考虑使用一个HTTPS连接。这解决了您自己必须加密/解密数据的问题(但需要一些设置)。这是对建议客户端加密而非HTTPS的评论的回应 重要的是要考虑你对谁的保护。 服务器端 如果数据库遭到破

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

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


有什么想法吗?

也许这就是你想要的:
所以你可以加密你的数据客户端并做验证服务器端。

你可能想考虑使用一个HTTPS连接。这解决了您自己必须加密/解密数据的问题(但需要一些设置)。

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


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

服务器端 如果数据库遭到破坏,服务器端哈希对于争取时间很重要

从服务器/CGI脚本的视图中,您将收到某种形式的身份验证令牌,您希望对其进行验证

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

因此,必须在服务器端进行某种(不可逆的)散列。MD5不是一个可行的解决方案。事实上,没有“快速”散列(包括SHA算法)能提供更好的保护:它们被优化用于快速和安全的完整性验证,而不是使密码破解变得尽可能困难。这可以通过重复散列/键拉伸来缓解(请参阅)。包括随机“盐”也很重要。不要在这里考虑“优化”。 运输 运输加密可以防止窥探者

机密访问令牌必须从客户端安全地传输到服务器。这通常通过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)对用户进行身份验证。你永远看不到秘密,只会从身份提供者那里得到一条“是/否”的信息。

你不必重新发明轮子。为此使用HTTPS连接。它会自动执行保护信息所需的所有操作。密码是如何存储在服务器端的?MD5,SHA1?在服务器端的正常运行时间现在的密码是文本格式,所以在服务器端的最后我匹配text@mohkhan如何建立https连接自从我用http发了这篇文章后,你能告诉我我是新来的吗?@user1995749:查看Authen::Passphrase,了解加密服务器端的方法(假设您不需要存储明文密码)。我还推荐Michael关于使用https处理客户机-服务器通信的回答。如果数据在客户端加密,那么cgi接收到参数的时间也会加密,因此如何解密javascript提供的加密并在perlWhy解密?方法是存储加密数据,并与加密值进行比较,而不是与清除值进行比较。例如,用户名3248u23sd9dsa4das7d2ff8f9374234必须与“John Doe”不匹配在数据库中,但是3248u23sd9dsa4das7d2ff8f9374234,或者如果你是偏执狂,也许你会在服务器端做进一步的加密。如果我们按照你提到的步骤做,那么这个步骤是,首先假设密码是kh123,我在javascript客户端用密钥Aspection 123对密码进行加密,然后将值存储在db a中然后,当用户到来时,它将再次对密码进行加密,如果加密值与之前发送的密码相同,则发送ack…因为我是新的…这是程序还是可能有改进?我认为这是一种方法。加密服务器端还是客户端取决于您,但您必须存储encryp您数据库中的ted版本不是清晰的版本,为什么您要解密用户密码?实际上是缺乏专业知识,我认为这会使解决方案对我来说更复杂:)非常感谢,请提供链接,以便在https上创建连接。https确保安全传输,但是密码加密必须以任何一种方式进行,无论是在客户端还是在服务器上。因此,它将是一个额外的安全层,用户应该使用它。您不必使用加密来验证用户。您应该保留盐渍哈希密码,并将其与提供的密码进行比较。我相信您可以找到大量的代码示例(例如on)。是的,您是对的。我把“加密”这个词用错了。