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 值)
虽然它显然似乎不起作用。为什么?我如何正确而简单地做到这一点?
这里有很多问题......比如没有盐的哈希可以被彩虹表。如果您发送并存储它们生成的哈希值...就像现在存储明文密码一样。如果客户端加盐和散列,然后服务器加盐和散列它......你如何确保他们可以使用正确的盐再次散列。最重要的是,使用安全连接,然后在服务器上加盐/散列。
在将密码发送到服务器之前在客户端对密码进行哈希处理完全是无稽之谈,不应该这样做。
不要认为我的话是理所当然的,让我们找出原因:
客户端将哈希密码发送到服务器。从攻击者的角度来看,哈希值是获取登录访问权限所需的全部内容(即攻击者欺骗传输中的哈希值并使用它来获取对服务器的访问权限)。
这与客户端发送纯文本密码的情况完全相同。攻击者会欺骗明文密码并使用它来登录。
因此,现在很明显,在客户端对密码进行哈希处理并不能减轻攻击者在传输过程中侦听您的密码的威胁情况。通过使用安全连接(例如 HTTPS)可以缓解这种威胁情况。
不过,对密码进行哈希处理仍然很重要:服务器应该对密码进行哈希处理,并将其与数据库中存储的哈希版本进行比较。还需要加盐,以减轻彩虹表攻击
我建议您使用 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)
我认为在客户端对密码进行哈希处理不是一个好主意。但你可以使用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)
| 归档时间: |
|
| 查看次数: |
24596 次 |
| 最近记录: |