【问题标题】:How to hide password from Post request url and browser dump如何从 Post 请求 url 和浏览器转储中隐藏密码
【发布时间】:2014-11-14 23:42:38
【问题描述】:

这可能是一个老问题,但我仍然没有找到这个问题的正确答案,所以请耐心等待。 我有一个 https 登录页面,它使用表单发布方法并将凭据发送到服务器......等等等等。

登录时,如果使用IE和F12进行网络监控,点击开始抓包。您可以看到一些类似于登录的 URL,servetloginauth(来自 gmail.com),您可以看到带有您的用户名和密码的请求正文。 好吧,有人可能会说,只有当用户没有注销时,你才能看到这一点。

现在注销并且不要关闭浏览器并从任务管理器中获取浏览器转储(任何浏览器,任何版本)(我不确定如何在 Mac 中执行相同操作)。 使用 WinHex 编辑器打开转储文件并搜索/查找:“password=”或实际密码(因为您测试您自己的登录,您已经知道您的密码)。 您可以以明文形式查看密码。

现在我的问题是,我怎样才能屏蔽密码: 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|<

我目前的解决方案如下,但我需要任何替代方案而无需付出太多努力。

密码可以从内存中读取,如果它被发送为 明文。使用加盐哈希技术进行密码传输 将解决此问题。散列是一种加密技术,其中 实际价值永远无法恢复。在盐渍哈希技术中, 密码作为哈希值存储在数据库中。服务器 生成一个随机字符串,盐,并将其与登录名一起发送 页面发送给客户端。页面上的 JavaScript 代码计算了 输入的密码,连接盐并计算哈希值 整个字符串。该值在 POST 请求中发送到服务器。

然后服务器从 数据库,连接相同的盐并计算哈希。如果用户 输入了正确的密码,这两个哈希值应该匹配。

现在,POST 请求将包含 密码和明文密码不会出现在内存中

SHA 256 是当今可用的强大哈希算法 - 现成的 JavaScript 中的实现可用并在“Good 阅读”部分。

注意:对于包含敏感信息的页面或包含数据的页面 可以在数据库中修改,使用JavaScript刷新内存 浏览

图片如下。

另外,我可以接受花旗银行在他们的网站上为他们的客户所做的一些事情。 我登录了网站,在转储中我看到我的用户名被屏蔽了(因为它出现在网站上),我也需要对密码字段做同样的事情。有人可以解释一下我该怎么做吗?

【问题讨论】:

    标签: java jsp ssl https sha256


    【解决方案1】:

    您必须了解密码在数据库中的存储方式。有多种方法可以做到这一点,但您无法创建任何无法破解/读取的内容。

    但是,您可以通过在将密码发送到服务器之前将密码散列 X 次来限制 MITM 攻击。 当服务器接收到哈希时,您将执行 X 轮新的哈希。您还应该弄清楚如何管理您的盐。

    这对于大多数应用程序来说应该足够了。这也是当今大多数应用程序的做法。

    gpEasy:http://gpeasy.com/ 通过在客户端拥有 50 次 Sha-256 来做到这一点。然后在服务器上再进行 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
    

    这是上述算法的一个版本,用于根据哈希中的第一个数字使用盐计算哈希。

    【讨论】:

      【解决方案2】:

      您的建议存在严重的安全漏洞。如果您在浏览器上计算哈希然后发送到服务器(没有密码),那么服务器就不能相信浏览器实际计算了哈希。黑客可能只是读取了散列值文件并构造了一个程序来发送散列值。安全性来自服务器(受信任的环境)拥有无法从散列中猜出的密码,然后向自己证明密码产生哈希。

      如果您同时发送哈希和密码,那么您还没有解决密码以明文形式提供的问题。

      如果您多次散列密码,似乎有一种方法。您可以在浏览器上对密码进行一次(或多次)哈希处理,并将其用于服务器上的后续哈希调用。多次散列似乎是正常的(尽管尚不清楚这在多大程度上真正使它更安全)。关键是浏览器会持有一个中间值,它不会告诉你用户输入的密码。但是,它仍然会告诉您需要发送到服务器以对用户进行身份验证的值。该值实际上是密码的代理,可在调用服务器时用作密码。但是……不是用户输入的密码。

      最后一种方法看起来可行:使用非对称加密。服务器提供盐值和公钥。密码使用公钥加密,只能由服务器上保存的私钥解密。因为盐值在每个会话中都会发生变化,所以保存在内存中的加密值将无法在另一个会话中使用。服务器解密该值,提取盐,给它一个密码,然后继续进行密码验证。

      【讨论】:

      • 同意。如果黑客知道密码是如何加盐的,他仍然可以进行字典攻击。一个可能的解决方案是做一个未加盐的 javascript 散列,然后在服务器上使用只有服务器知道的盐重新散列。服务器的哈希值将存储在数据库中。
      • @Tap,如果 salt 是随登录请求从服务器动态生成/发送的,那么攻击者将很难使用它来对付你,对吧?而且这些攻击会减慢,让攻击者认为是否值得(这个想法将取决于他试图攻击的网站,无论是社交网络、金融网站还是邮件网站)。我的只是一个理论,有待解答。
      猜你喜欢
      • 2016-10-26
      • 1970-01-01
      • 2012-06-16
      • 2015-02-20
      • 2016-01-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多