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

Java 如何从Post请求url和浏览器转储中隐藏密码,java,jsp,ssl,https,sha256,Java,Jsp,Ssl,Https,Sha256,这可能是一个老问题,但我仍然没有找到这个问题的正确答案,所以请耐心等待。 我有一个https登录页面,它使用form post方法并将凭据发送到服务器…诸如此类 登录时,如果您使用IE和F12进行网络监控,请单击开始捕获。你可以看到一些类似于login的URL,servetloginauth(来自gmail.com),你可以看到带有用户名和密码的请求正文。 好吧,有人会说,只有用户没有注销,你才能看到 现在注销,不要关闭浏览器并从Task Manager中获取浏览器转储(任何浏览器,任何版本)(

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

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

现在注销,不要关闭浏览器并从Task Manager中获取浏览器转储(任何浏览器,任何版本)(我不知道如何在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|<


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

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

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


最后一种方法看起来是可行的:使用非对称加密。服务器提供salt值和公钥。密码使用公钥加密,公钥只能由服务器上持有的私钥解密。因为salt值在每个会话中都会更改,所以内存中保存的加密值本身在另一个会话中不可用。服务器解密该值,提取salt,并为其提供密码,然后进行密码验证。

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

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

对于大多数应用来说,这应该足够了。现在大多数应用程序也是这样做的

gpEasy:通过在客户端使用Sha-256,50次来实现这一点。然后在服务器上再进行950轮。总共1000发。这还包括由其“当前哈希”计算的salt


这是上述算法的一个版本,用于从散列中的第一个数字开始用salt计算散列。

同意。如果黑客知道密码是如何加密的,他仍然可以运行字典攻击。一个可能的解决方案是执行一个非盐javascript哈希,然后在服务器上使用只有服务器知道的盐重新哈希。服务器的散列是存储在数据库中的内容。@点击,如果salt是随登录请求从服务器动态生成/发送的,攻击者将很难对您使用它,对吗?而且这些攻击也会减慢速度,让攻击者思考是否值得(这种想法将取决于他试图攻击的网站,无论是社交网络、金融网站还是邮件网站)。我的只是一个理论,并开放的答案。
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