- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在尝试创建以下流程:
我(很长一段时间)在数据类型上苦苦挣扎。
下面是代码,首先生成 key (客户端):
// some reusable settings objects
const crypto = window.crypto.subtle;
let publicKeyToExport = {};
let privateKeyToStore = {};
// function called to create a keypair
const generateKeypair = () => {
crypto.generateKey({
name : 'RSA-OAEP',
modulusLength : 2048, //can be 1024, 2048, or 4096
publicExponent : new Uint8Array([0x01, 0x00, 0x01]),
hash : {name: 'SHA-256'}, //can be "SHA-1", "SHA-256", "SHA-384", or "SHA-512"
}, true, ['encrypt', 'decrypt']
).then((key) => {
publicKeyToExport = key.publicKey;
privateKeyToStore = key.privateKey;
console.log(key);
}).catch((err) => {
console.error(err);
});
};
然后导出:
// function to export the generate publicKey
const exportPublicKey = (publicKey) => {
crypto.exportKey('jwk', publicKey)
.then((keydata) => {
fetch('/key2', {
method : 'POST',
mode : 'cors',
body : JSON.stringify(keydata),
headers : new Headers({
'Content-Type' : 'application/json'
})
}).then(res => res.json())
.catch(err => console.error(err))
.then(res => console.log(res));
console.log(keydata);
})
.catch((err) => {
console.log(err);
});
};
保存 key :
app.post('/key2', (req, res) => {
webcrypto.subtle.importKey(
'jwk', req.body,
{
name : 'RSA-OAEP',
hash : {name : 'SHA-256'},
},
false,
['encrypt']
).then((publicKey) => {
keyStorage.setItem('alicePubKey', publicKey);
if(publicKey == keyStorage.getItem('alicePubKey'));
res.json({ 'success' : 'key received and saved' });
console.log('saved key from client: ' + publicKey);
return;
})
.catch((err) => {
console.error(err);
});
});
在服务器上加密:
app.get('/challenge', (req, res) => {
let challengeFromServer = null;
let key = keyStorage.getItem('alicePubKey');
let buf = new Buffer.from('decryptthis!');
webcrypto.subtle.encrypt(
{
name : 'RSA-OAEP'
}, key, buf
)
.then((encrypted) => {
console.log('challenge created: ' + encrypted);
res.json({'challenge' : new Uint8Array(encrypted) })
})
.catch((err) => {
console.error(err);
})
获取加密数据并解密 - 不起作用:)
const requestChallenge = () => {
fetch('/challenge')
.then((res) => {
return res.json();
})
.then((data) => {
console.log(data);
console.log(ArrayBuffer.isView(data.challenge))
console.log(new ArrayBuffer(data.challenge))
crypto.decrypt({
name : 'RSA-OAEP'
}, privateKeyToStore, new ArrayBuffer(data.challenge))
.then((decrypted)=>{
console.log(decrypted)
})
.catch(err => console.error(err));
})
.catch(err => console.error(err));
};
以下几行是我认为的问题!
console.log(ArrayBuffer.isView(data.challenge)) // false
console.log(new ArrayBuffer(data.challenge)) // empty
小更新:
res.json(
{'challenge' : encrypted , // {} empty
'uint' : new Uint8Array(encrypted), // {0: 162, 1: 252, 2: 113, 3: 38, .......
'stringify' : JSON.stringify(encrypted), // "{}" empty
'toString' : encrypted.toString() // "[object ArrayBuffer]"
});
最佳答案
解决了!
问题出在数据类型上。
如果有人遇到问题,解决此问题的方法是确保在您的服务器上将密文作为缓冲区发送,我的 Express 应用程序:
res.write(new Buffer(encrypted), 'binary')
res.end(null, 'binary')
在客户端接收并解码,如下:
const decryptedReadable = new TextDecoder().decode(decrypted)
祝你编码愉快。
关于javascript - 在 Nodejs 中加密并使用 WebCrypto API 在客户端解密,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49455131/
我是 GUN 的作者,我喜欢你的作品! 我对应该使用哪些库,或者哪些库相互依赖感到有点困惑: node-webcrypto-ossl 网络加密 webcrypto-core node-webcrypt
我在使用 PBKDF2 和 Webcrypto 时遇到问题。我想将 PBKDF2 与 SHA-1 算法一起使用。目前,我有, const ENCODING = "utf-8"; const HMACS
我正在使用 JavaScript WebCrypto API。我需要做下一个序列: 生成RSA-PSS key 对; 使用 AES-GCM 封装私钥; 有机会展开第 2 步的结果。 我知道我必须存储来
使用 JavaScript 和 WebCrypto API(没有任何外部库),使用从用户提交的密码派生的 key 加密字符串的最佳方法是什么? 这是一些代码,其中 key 不是派生的,而是由 gene
我正在评估 WebCrypto 性能与第三方加密库的比较 SJCL和 Forge .我希望 WebCrypto 快得多,因为它是 native 浏览器实现。这也是benchmarked before并
我正在使用 Web Crypto API并且正在使用 generateKey 生成 RSA key 对功能。由于我的代码中的一些错误,我删除了一些用户的公钥。我想知道是否有任何方法可以从私钥生成公钥?
我读过这篇文章document通过ECDH-CURVE25519算法生成 key 对。但是当我在 window.crypto.subtle.generateKey 中指定 ECDH-CURVE2551
我尝试使用静态 RSA 公钥来加密 session 生成的 AES key ,然后使用该 key 加密密码,并且输入 RSA 加密密码的随机生成的 AES session key 有以下错误消息: T
我正在尝试使用 WebCrypto API 加密大文件 (> 1GB) . 加密小文件效果很好,但是当我尝试加密大文件时,我的浏览器挂起,似乎加密从未完成。 我认为最好的选择是读取和加密文件的 blo
是否可以使用字符串作为加密 key 并仅使用 WebCryptoAPI 来加密 CryptoKey(私钥)?我实现了一个功能,但出现以下错误: Uncaught (in promise) DOMExc
我的应用程序密码学目前使用 forge用于加密、解密、派生 key 和导入 key 的库。我最近开始阅读有关 the new cryptographic features that are part
我正在使用 webcrypto API 成功地加密服务器和客户端之间的消息(假设我需要手动执行此操作)。 我的问题是我需要检查用户和服务器的 key 对是否已经存在,而不是一直生成新的 key 对。有
我正在使用 Node v17.4 并想使用 webcrypto API。基于 this example我正在尝试导入 subtle进入我的项目,但 TypeScript 出现错误 Property '
在 Chrome 中这失败了: window.crypto.subtle.generateKey( { name: "RSA-OAEP", modulusLen
我想做的是在网络浏览器中使用 SubtleCrypto.encrypt() 提供的 128 位 AES-CBC 加密来加密 16 字节数据包。 我期望找到 16 字节输入的 16 字节加密数据。 我实
我正在使用 Webcrypto API 在客户端进行一些加密工作。尽管我无法包装和解开 key ,但浏览器总是返回以下错误。 DOMException [OperationError: "The op
有没有什么方法可以使用 javascript cryto Api 为多个公钥加密数据(这样多个 key 所有者可以使用他们的私钥解密数据)。 如果使用 RSA-OAEP 无法做到这一点,您能否提出相同
我正在尝试使用 webcrypto 加密并在 php 中使用 openssl 解密。要在 php 中解密,我需要一个身份验证标签。有没有一种方法可以从密文中提取它,或者我可以通过其他任何方式获取它?
所以,我开始研究 WebCrypto API,因为它看起来非常快,api 使用起来相当简单,而且我设法很容易地实现了加密/解密。 现在我想看看是否可以使用它进行渐进式加密/解密。我目前使用 Crypt
我确实发现 IE11 支持网络加密 API。是否可以通过 Javascript 使用此 API 访问浏览器商店中的 key ?我找不到任何接口(interface)。 最佳答案 不幸的是,这是不可能的
我是一名优秀的程序员,十分优秀!