我正在做一个应用程序来处理用户可以登录的位置,并查看与特定网络相关的所有GIS数据(全球信息系统)。
这属于正常域名(我的意思是不涉及金钱)
我的问题是,当用户登录登录页面时(我打算使用base64.encode来保护密码)
关于上述问题,我有3个问题
当用户在登录页面提交用户名和密码时,我打算在Servlet级别使用加密(这是使用req.getparameter("password")
static public char [] encode(byte [] data) {
}
请告诉我这是否正确?
请告诉我这是否正确?
答案 0 :(得分:1)
base64不是加密方案,它是一种编码方案。它不提供任何安全性,除了以某种经验易于识别的方式轻微模糊传输数据。请勿将其用于安全目的。
如果您想要保护您的用户< - >服务器流量被嗅探,几乎所有您需要的东西都已在HTTPS / SSL中实现。使用它可以节省您的开发时间,并保护自己免受内部计划不完善的错误。
答案 1 :(得分:1)
这里有两个独立的(ish)问题;身份验证和保密。如果您需要保密,请使用HTTPS。然后您不必担心传输加密,只需以明文形式发送所有内容(因为SSL将为您执行完全连接加密)。
密码存储;你永远不应该在任何地方存储明文密码。始终首先对密码进行哈希处理(至少查找password salting以获得更强大的方法)并将哈希值存储在数据库中。当用户发送密码时,对他们发送的内容进行散列并将其与数据库中的值进行比较,如果匹配,则密码正确无误。
如果您不想使用SSL / HTTPS,那么您认为需要避免以明文形式发送密码是正确的。您可以通过多种方式实现此目的,在我看来最合适的是Challenge-Response,其中您通过生成随机字符串并将其回显到javascript中,从登录页面中的php发送随机“nonce”变量
然后使用javascript计算;
hash(hash(password) + nonce);
其中hash是安全散列函数,例如MD5或SHA。
这样,在服务器上,您可以验证密码,而无需用户以明文形式发送密码。通过散列存储在与同一个随机数串联的数据库中的值,并将其与用户发送的值进行比较,如果值匹配,密码是正确的。
所有这一切的重点是通过确保用户永远不会向服务器发送两次相同的登录字符串来防止Replay Attacks。攻击者可以窃听并记录他们喜欢的登录数量,在同一用户帐户使用相同的随机数之前,它们都将无用。避免这只是使用非常大的随机数的情况。
但请注意,此方法无法防范Relay Attacks或Man-in-the-middle Attacks。这些类型的攻击需要相互身份验证,这只能通过使用第三方(例如证书颁发机构)来实现,这会使我们完全回到SSL / HTTPS。