最新的浏览器中是否有任何内置的JavaScript字符串哈希函数?

44
每当新版本的浏览器出现时,我听说有新的东西被添加进来,比如WebGL和其他一些技术,但没人知道它们是否会得到广泛应用。不过我想知道,是否有人曾经考虑过JS中的基本问题,例如哈希函数(MD5、SHA1等)。
最新版本的浏览器包括今天的开发版本,例如Opera 12、Chrome 17或Firefox 10。
现在我正在寻找解决方案,在另一个线程中找到了这个评论:https://stackoverflow.com/questions/7204097/short-hashing-function-for-javascript你知道JavaScript对象已经是哈希表吗?)。那么这些“哈希表”是什么意思?这是否意味着我可以将任何字符串转换为哈希值,但不能使用像MD5或SHA1这样已经建立的哈希算法,而是要使用特定于JS内置的算法?
基本上我需要做的是:
var txt="Hello world!";
var hash = txt.toSha1();

4
您似乎混淆了哈希表(一种对象,可以将值存储在命名键上,例如{name: "bob", dob: "27/1/1970"})和哈希函数(一种用于将大数据集映射到小数据集的函数,例如MD5)。请注意区分两者。 - Quentin
是的,现在我明白了,我要寻找的与哈希表无关。 - rsk82
crypto.subtle.digest(algorithm, data) - The Bomb Squad
4个回答

49

对于仍在寻找此信息的任何人。有一个WebCrypto API,该API似乎已于2017年初完成。

要在浏览器中使用它,您可以在window.crypto.subtle中找到它,其中包含加密、摘要等方法。有关可用函数的文档在这里


3
使用digest()函数获取数组缓冲区的哈希值。https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/digest - Tim Swast
要使其适用于字符串(而不是数组缓冲区),请参见下方 - undefined

7

6
好的,基本上是这样。但我的问题是关于浏览器的新发展,它们不断地添加新功能,我想知道它们是否最终也会添加哈希值。是否有计划进行这项工作,或者由于某些原因而被阻止了呢? - rsk82
哦,我明白了。在浏览器的上下文中,我不知道有没有这样的东西,但是如果你正在使用[node.js](http://nodejs.org/),那么已经有一个[加密包](http://nodejs.org/docs/latest/api/crypto.html)可以处理这些事情。 - Greg Guida
1
@rsk82 你可能想要接受新的WebCrypto答案。虽然已经过了几年,但未来的访问者仍在寻找相同的答案=) - Mike 'Pomax' Kamermans

4
async function sha256(source) {
    const sourceBytes = new TextEncoder().encode(source);
    const digest = await crypto.subtle.digest("SHA-256", sourceBytes);
    const resultBytes = [...new Uint8Array(digest)];
    return resultBytes.map(x => x.toString(16).padStart(2, '0')).join("");
}

1
您还可以在Node环境中使用它,如crypto.webcrypto.subtle。因此,您可以编写await (crypto.subtle || crypto.webcrypto.subtle).digest(...)(当然,如果不支持,则会抛出异常)。 - AgainPsychoX

-9

注意:此答案是在2014年编写的,当时Web Cryptography API尚未推出。不要在需要加密安全性的情况下使用此方法。但在需要具有“内置”支持的简单可逆加密时,此方法可能会有用。

当我需要在客户端进行简单哈希而又不想使用外部库时,我会使用浏览器内置的atob()btoa()函数。

window.btoa()可以从二进制数据的“字符串”创建一个Base64编码的ASCII字符串。

function utf8_to_b64( str ) {
    return window.btoa(encodeURIComponent( escape( str )));
}

window.atob()函数用于解码使用base-64编码的数据字符串。
function b64_to_utf8( str ) {
    return unescape(decodeURIComponent(window.atob( str )));
}

http://caniuse.com/#search=btoahttp://caniuse.com/#search=atob显示现代浏览器对其支持非常广泛。

示例来自https://developer.mozilla.org/en-US/docs/Web/API/window.btoa


19
这是一种有用的可逆的1:1编码方式,可以将明文转换为更加难以理解和比输入数据_更大_的输出数据。这两者与所需的单向密码哈希函数的属性正好相反。 - ecmanaut
11
该帖子和标题并没有暗示它必须是加密和安全的。该帖提到的功能并非全部都是安全或不可破解的。他要求“等等”,并且重点似乎在于“内置”。这是一个有效的回答,对某些人很有帮助。在许多情况下,哈希值可以很有用,安全并不是问题。 - mit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接