这可能是一个老问题,但我仍然没有找到这个问题的正确答案,所以请耐心等待。 我有一个https登录页面,它使用表单发布方法并将凭据发送到服务器......等等等等。
在登录时,如果您使用IE和F12进行网络监控,请单击开始捕获。您可以看到一些类似于login,servetloginauth(来自gmail.com)的URL,您可以使用您的用户名和密码查看请求正文。 好吧,有人可以争辩说,只有用户没有注销你才能看到。
现在注销并关闭浏览器并从任务管理器中删除浏览器转储(任何浏览器,任何版本)(我不知道如何在Mac中执行相同操作)。 使用WinHex编辑器打开转储文件并执行搜索/查找:"密码="或实际密码(因为你测试自己的登录,你已经知道你的密码)。 您可以以明文形式查看密码。
现在我的问题是,如何屏蔽密码: 1.在Post请求URL中 2.或者当浏览器将我的凭据保存到转储时,我需要将其屏蔽/加密,或者根本不应保存密码。
我的jsp代码:
<s:form id="login" name="loginForm1" action="login" namespace="/" method="post" enctype="multipart/form-data" >
<fieldset><!-- login fieldset -->
<div><!-- div inside login fieldset -->
<div....
<label for="password" class="loginLabel">Password</label>
<input type="password" name="password" id="password" class="longField nofull absPosition" size="16" autocomplete="off" alt="Password" placeholder="Password" title="Password|<
目前的解决方案我有如下,但我需要任何替代方案而不需要太多努力。
如果密码被发送,则可以从内存中读取密码 明文。使用salted哈希技术进行密码传输 将解决此问题。哈希是一种加密技术 实际价值永远无法恢复。在盐渍哈希技术中, 密码存储为数据库中的哈希值。服务器 生成随机字符串salt,并将其与Login一起发送 页面到客户端。页面上的JavaScript代码计算哈希值 输入的密码,连接盐并计算哈希值 整个字符串。该值将在POST请求中发送到服务器。
然后,服务器从中检索用户的哈希密码 数据库,连接相同的salt并计算哈希值。如果是用户 输入了正确的密码后,这两个哈希值应匹配。
现在,POST请求将包含salted哈希值 密码和明文密码不会出现在内存中
SHA 256是一种强大的哈希算法,现已上市 - 现成的 JavaScript中的实现可用,并在&#34; Good中引用 读取&#34;部分。
注意:对于包含敏感信息的页面或包含数据的页面 可以在数据库中修改,使用JavaScript来刷新内存 浏览
,图像如下。
另外,我可以和花旗银行在其网站上为客户做的事情达成和解。 我登录了网站并在转储中看到我的用户名被屏蔽了(因为它出现在网站上),我需要一些与密码字段相同的东西。有人可以解释我该怎么做。
答案 0 :(得分:1)
您的建议存在严重的安全漏洞。如果您在浏览器上计算哈希值然后发送到服务器(没有密码),那么服务器就不能相信浏览器实际计算了哈希值。黑客可能只是读取了散列值文件并构造了一个程序来发送散列值。安全性来自服务器(可信环境),其密码无法从散列中猜出,然后证明自己密码产生哈希值。
如果您同时发送哈希和密码,那么您还没有解决有关密码以明文形式提供的问题。
如果您多次散列密码,似乎有办法。您可以在浏览器上对密码进行一次(或多次)哈希处理,并将其用于服务器上的后续哈希调用。多次哈希似乎是正常的(虽然目前还不清楚这实际上使它更安全多少)。关键是浏览器将保留一个中间值,该值不会告诉您用户键入的密码。但是,它仍会告诉您需要发送到服务器以验证用户身份的价值。该值实际上是密码的代理,并且在调用服务器时可用作密码。但是......它不是用户输入的密码。
最后一种方式看起来可能有用:使用非对称加密。服务器提供salt值和公钥。密码使用公钥加密,只能通过服务器上保存的私钥解密。由于salt值会在每个会话中发生更改,因此内存中保存的加密值将无法在另一个会话中使用。服务器解密该值,提取salt,为其提供密码,然后进行密码验证。
答案 1 :(得分:1)
您必须设备密码如何存储在数据库中。有多种方法可以做到这一点,但是你无法创建任何不可能进行黑客攻击/阅读的东西。
但是,您可以通过在将密码发送到服务器之前对密码进行哈希X次来限制MITM攻击。 当服务器接收散列时,您会执行X个新散列循环。您还应该弄清楚如何管理盐。
对于大多数应用程序来说,这应该足够了。这也是大多数应用程序最近如何做到的。
gpEasy:http://gpeasy.com/通过在客户端使用Sha-256 50次来做到这一点。然后在服务器上另外950轮。总计1000轮。这还包括一个由“当前哈希”计算的盐
def hash(self, pw, loops = 50):
pw = pw.strip()
for i in range(loops):
salt_len = re.sub(r'[a-f]', '', pw)
try:
salt_start = int(salt_len[0:0+1])
except ValueError:
salt_start = 0
try:
salt_len = int(salt_len[2:2+1])
except ValueError:
salt_len = 0
salt = pw[salt_start:salt_start+salt_len]
pw = hashlib.sha512(pw.encode('utf-8') + salt.encode('utf-8')).hexdigest()
return pw
这是所提到的算法的一个版本,用于使用散列中的第一个数字计算哈希值。