我想要一个5个字符的字符串,由从集合中随机挑选的字符组成[a-zA-Z0-9].
使用JavaScript执行此操作的最佳方法是什么?
是否有一种普遍接受的技术可以有效地将JavaScript字符串转换为ArrayBuffers,反之亦然?具体来说,我希望能够将ArrayBuffer的内容写入localStorage并将其读回.
基本上,我正在尝试创建一个独特对象的对象,一组.我有一个很好的想法,就是只使用带有对象的JavaScript对象作为属性名称.如,
set[obj] = true;
Run Code Online (Sandbox Code Playgroud)
这很有效.它适用于字符串和数字,但对于其他对象,它们似乎都"散列"到相同的值并访问相同的属性.是否有某种方法可以为对象生成唯一的哈希值?字符串和数字如何做,我可以覆盖相同的行为吗?
我正在为一个论坛写一个登录,并且需要在将它发送到服务器之前在javascript中对密码客户端进行散列.我无法确定哪些SHA-256实现我可以信任.我期待每个人都使用某种权威脚本,但我发现大量不同的项目都有自己的实现.
我意识到使用其他人的加密始终是信仰的飞跃,除非你有资格自己审查它,并且没有"值得信赖"的普遍定义,但这似乎是一种常见且重要的东西,应该有某种形式关于使用什么的共识.我只是天真吗?
编辑,因为它在评论中出现了很多:是的,我们在服务器端再次执行更严格的哈希.客户端散列不是我们在数据库中保存的最终结果.客户端散列是因为人类客户端请求它.他们没有给出具体原因,可能他们只是喜欢矫枉过正.
我正在尝试为教育目的而用JavaScript制作JWT生成器。有一个jwt.io工具可以创建和/或验证JWT。
我正在努力使我的结果与验证器的结果匹配。问题是签名。
这是我的代码:
function base64url(input) {
return btoa(typeof input === 'string' ? input : JSON.stringify(input))
.replace(/=+$/, '')
.replace(/\+/g, '-')
.replace(/\//g, '_');
}
const JWT = {
encode(header, payload, secret) {
const unsigned = [base64url(header), base64url(payload)].join('.');
return [unsigned, base64url(sha256.hmac(secret, unsigned))].join('.');
}
};
Run Code Online (Sandbox Code Playgroud)
为了加密HMAC SHA256,我将js-sha256库与sha256.hmac(key, value)原型一起使用。我将其与在线工具进行了比较,并且效果很好。
现在,我用以下代码对其进行测试:
const jwt = JWT.encode(
{
alg: 'HS256',
typ: 'JWT'
},
123,
'xxx'
);
Run Code Online (Sandbox Code Playgroud)
我得到的结果是:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.MTIz.NzhlNTFmYzUxOGQ2YjNlZDFiOTM0ZGRhOTUwNDFmMzEwMzdlNmZkZWRhNGFlMjdlNDU3ZTZQNY
另一方面,jwt.io的结果是:
eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.MTIz.eOUfxRjWs-0bk03alQQfMQN-b97aSuJ-RX5qXatFwbE
如您所见,JWT的三个大块中的两个在我的结果和jwt.io结果中是相同的。签名是不同的,如果您问我,它生成的签名非常短。该工具还将我自己的JWT标记为无效。
我检查了在线HMAC SHA256生成器,看起来我的代码创建了有效的签名,因此:
base64url(sha256.hmac('xxx', 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.MTIz')) ===
'NzhlNTFmYzUxOGQ2YjNlZDFiOTM0ZGRhOTUwNDFmMzEwMzdlNmZkZWRhNGFlMjdlNDU3ZTZhNWRhYjQ1YzFiMQ'
Run Code Online (Sandbox Code Playgroud)
被 …
javascript ×5
hash ×2
arraybuffer ×1
hashcode ×1
jwt ×1
random ×1
set ×1
sha2 ×1
sha256 ×1
typed-arrays ×1