在提交表单之前散列密码客户端的简单方法

sal*_*ira 7 html javascript security

没有任何常见的 JS 库,如何在发送密码之前散列密码?

<form>
    <input type="password" id="pwd" name="password" />
    <input onclick="
var val = document.getElementById('pwd').value;
document.getElementById('pwd').value(sha512(val));"
     type="submit">
</form>
Run Code Online (Sandbox Code Playgroud)

不知何故,这将是我天真的方法(sha512 是在某处定义的函数以创建 sha512 值)

虽然它显然似乎不起作用。为什么?我如何正确而简单地做到这一点?

Gob*_*ord 9

这里有很多问题......比如没有盐的哈希可以被彩虹表。如果您发送并存储它们生成的哈希值...就像现在存储明文密码一样。如果客户端加盐和散列,然后服务器加盐和散列它......你如何确保他们可以使用正确的盐再次散列。最重要的是,使用安全连接,然后在服务器上加盐/散列。

  • 我认为你没有抓住重点......这样做......好吧,学习它是没有意义的,因为在实践中它没有意义。如果您发送散列...并存储散列...那么您实际上是在存储明文密码。对密码进行哈希处理的目的是让其他人无法读取您的数据库记录,然后使用其中包含的密码来获得访问权限。如果您只根据哈希值检查哈希值...您将一无所获,并且会降低其安全性。 (2认同)

Gia*_*ini 7

在将密码发送到服务器之前在客户端对密码进行哈希处理完全是无稽之谈,不应该这样做。

不要认为我的话是理所当然的,让我们找出原因:

客户端将哈希密码发送到服务器。从攻击者的角度来看,哈希值是获取登录访问权限所需的全部内容(即攻击者欺骗传输中的哈希值并使用它来获取对服务器的访问权限)。

这与客户端发送纯文本密码的情况完全相同。攻击者会欺骗明文密码并使用它来登录。

因此,现在很明显,在客户端对密码进行哈希处理并不能减轻攻击者在传输过程中侦听您的密码的威胁情况。通过使用安全连接(例如 HTTPS)可以缓解这种威胁情况。

不过,对密码进行哈希处理仍然很重要:服务器应该对密码进行哈希处理,并将其与数据库中存储的哈希版本进行比较。还需要加盐,以减轻彩虹表攻击

  • 客户端散列可防止服务器管理员查看明文密码。它也应该在服务器端进行哈希处理。 (6认同)
  • 虽然这个问题很老了,但我认为我的思考过程是,如果攻击者监听密码并且它以纯文本形式发送,那么攻击者也会知道受害者用于其他服务的密码。如果仅发送哈希值,那么攻击者可能能够破坏该单个服务,但无法破坏用户访问的所有服务。当然,可以通过两次不使用密码、使用密码生成管理器等来缓解这种情况,但我们都知道世界并不是这样运作的...... (2认同)

gae*_*noM 6

我建议您使用 jsSHA public sw 并将其放在您的 js 之外:

function mySubmit(obj) {
  var pwdObj = document.getElementById('pwd');
  var hashObj = new jsSHA("SHA-512", "TEXT", {numRounds: 1});
  hashObj.update(pwdObj.value);
  var hash = hashObj.getHash("HEX");
  pwdObj.value = hash;
}
Run Code Online (Sandbox Code Playgroud)
<script src="https://cdnjs.cloudflare.com/ajax/libs/jsSHA/2.0.2/sha.js"></script>

<form>
    <input type="password" id="pwd" name="password" />
    <input onclick="mySubmit(this)" type="submit">
</form>
Run Code Online (Sandbox Code Playgroud)


Rub*_*yan 0

我认为在客户端对密码进行哈希处理不是一个好主意。但你可以使用CryptoJS

https://code.google.com/p/crypto-js/

<script src="http://crypto-js.googlecode.com/svn/tags/3.1.2/build/rollups/sha512.js"></script>
<script>
    var hash = CryptoJS.SHA512("Message");
</script>
Run Code Online (Sandbox Code Playgroud)