在Web应用程序中,密码加密的方式和位置如何?例如,当用户注册到网站上时,是否将用户设置的密码作为纯文本传输并在服务器端应用加密并保存在数据库中?
另一方面,当使用HTTPS时,数据将被加密并通过网络发送。在这种情况下,我们是否再次对传入的数据应用任何加密算法,然后将其保留在数据库中?另外,请说明通过HTTPS传输数据时将使用哪种加密算法。
答案 0 :(得分:1)
HTTPS加密客户端和服务器之间的通信,这可以防止ManInTheMiddle攻击。借助HTTPS,您可以将密码保存到服务器,而对于开发人员而言,无需进行任何工作。
服务器将自动解密密码,您的应用程序将获得纯文本密码。在将密码哈希存储到数据库之前,您需要使用密码哈希。推荐的密码哈希为BCrypt,SCrypt,Argon2和PBKDF2。
答案 1 :(得分:1)
除了martinstoeckli答案:
第2条规则:加密始终是第二选择。如果可以使用哈希,请这样做。
HTTPS是异步加密(私钥+公钥)。原理是,使用公钥加密的所有内容只能使用关联的私钥解密。
在我们的例子中,客户端将使用公共密钥来加密数据。并且服务器将是唯一能够使用私钥解密数据的服务器。
因此,私钥完成其工作后,您将获得数据的明文。
在这一点上,(我认为)最好的做法是对数据进行散列(+ salt +最终是pepper)并将散列存储在数据库中。
例如,当用户尝试使用其密码登录时,服务器将再次对收到的纯文本密码(显然使用相同的盐/花椒)进行哈希处理,并与数据库中的密码进行比较。
如果哈希值与数据库中的哈希值完全相同,则表示用户输入的密码正确。