如何从Post请求URL和浏览器转储中隐藏密码

时间:2014-11-14 23:42:39

标签: java jsp ssl https sha256

这可能是一个老问题,但我仍然没有找到这个问题的正确答案,所以请耐心等待。 我有一个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来刷新内存   浏览

,图像如下。 enter image description here enter image description here enter image description here

另外,我可以和花旗银行在其网站上为客户做的事情达成和解。 我登录了网站并在转储中看到我的用户名被屏蔽了(因为它出现在网站上),我需要一些与密码字段相同的东西。有人可以解释我该怎么做。 enter image description here

2 个答案:

答案 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

这是所提到的算法的一个版本,用于使用散列中的第一个数字计算哈希值。