- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我想对聊天室(网络应用程序)中的消息进行加密,除了接收者之外,任何人都无法解密它们。看来RSA加密是一个好方法。每个用户(实际上是每个设备)都会有一个公钥-私钥对,每条消息都将使用接收者公钥进行加密,并使用接收者私钥进行解密,因此每条消息都应该发送与接收者相同的次数。我找到了tutorial其中解释了如何实现该目标。加密/解密是在 Service Worker 中计算的,私钥不会暴露,只是存储在同一个 Worker 中。
但是,我想知道是否有一种安全的方法可以从设备导出 key 对,以便能够从另一台设备查看您的消息。我可以添加一个名为 "exportKeys"
的 messageType
并检索两个 key ,如下例所示:
从上面的教程中添加“exportKeys”消息类型和函数:
self.window = self // This is required for the jsencrypt library to work within the web worker
// Import the jsencrypt library
self.importScripts('https://cdnjs.cloudflare.com/ajax/libs/jsencrypt/2.3.1/jsencrypt.min.js');
let crypt = null
let privateKey = null
/** Webworker onmessage listener */
onmessage = function(e) {
const [ messageType, messageId, text, key ] = e.data
let result
switch (messageType) {
case 'generate-keys':
result = generateKeypair()
break
case 'encrypt':
result = encrypt(text, key)
break
case 'decrypt':
result = decrypt(text)
break
case 'exportKeys':
result = exportKeys(key)
break
}
// Return result to the UI thread
postMessage([ messageId, result ])
}
/** Generate and store keypair */
function generateKeypair () {
crypt = new JSEncrypt({default_key_size: 2056})
privateKey = crypt.getPrivateKey()
// Only return the public key, keep the private key hidden
return crypt.getPublicKey()
}
/** Encrypt the provided string with the destination public key */
function encrypt (content, publicKey) {
crypt.setKey(publicKey)
return crypt.encrypt(content)
}
/** Decrypt the provided string with the local private key */
function decrypt (content) {
crypt.setKey(privateKey)
return crypt.decrypt(content)
}
/** Export keys */
function exportKeys (publicKey) {
return {
publicKey: publicKey,
privateKey: privateKey
}
}
然后,我可以向用户显示二维码或其他内容,将其 key 导出到另一台设备,并让他使用 "importKeys"
之类的内容执行与新设备相反的操作。
尽管这可能有效,但我也会在客户端使用 "exportKeys"
公开私钥。但如果你不真正通过互联网发送私钥,会出现安全问题吗?
还有其他相关提示吗?
最佳答案
如果是私有(private)
和加密
消息,也许您可以在javascript中使用libsodium实现,例如js-nacl ,或libsodium用于使用 crypto_box 实现公钥验证加密
。大多数功能与您已经使用的功能相似。为了更好地解释:
发送者和接收者必须拥有一组 key (公共(public)和私有(private))才能加密/解密消息。
发件人需要 sender-PrivateKey
和 recipient-PublicKey
以及 nonce
来加密消息。
收件人需要 recipient-PrivateKey
和 sender-PublicKey
以及 nonce
来解密消息。
示例代码取自 js-nacl Github 自述页面。
senderKeypair = nacl.crypto_box_keypair();
recipientKeypair = nacl.crypto_box_keypair();
message = nacl.encode_utf8("Hello!");
nonce = nacl.crypto_box_random_nonce();
packet = nacl.crypto_box(message, nonce, recipientKeypair.boxPk, senderKeypair.boxSk);
decoded = nacl.crypto_box_open(packet, nonce, senderKeypair.boxPk, recipientKeypair.boxSk);
"Hello!" === nacl.decode_utf8(decoded); // always true
I want to encrypt messages in chat rooms (web app) in a way that it wouldn't be possible for anyone to decrypt them except for the receivers. It seems that RSA encryption is a good way.
我不知道RSA加密是不是一个好方法。根据被认为是最好的策略Cryptographic Best Practices - Asymmetric Encryption使用libsodium(NaCL)函数进行加密比RSA更好。
最后一件事是如何导出 key 而不泄露它们?
您可以使用 nacl.crypto_box_seed_keypair(Uint8Array)
导出 key 和用户提供的输入(要转换为 Uint8Array 使用 nacl.encode_utf8(String) )。
nacl.crypto_box_seed_keypair(Uint8Array)
Produces an encrypted authenticated box keypair from its argument. A given binary input will always produce the same keypair as output.
The input may be of any length. The input is hashed once with sha512, and the first 32 bytes of the result are taken as the 32-byte secret key, which is then passed to nacl.crypto_box_keypair_from_raw_sk.
关于javascript - 从 Web 应用程序导出/导入 RSA key 对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51767414/
查看“mysqldump -d”并看到一个键是 KEY,而不是“PRIMARY KEY”或“FOREIGN KEY” 什么是关键? 示例: CREATE TABLE IF NOT EXISTS `TA
在我开始使用 Python 的过程中尝试找出最佳编码实践。我用 Pandas 写了一个 csv 到数据框阅读器。它使用格式: dataframe = read_csv(csv_input, useco
在 Flutter 中,用一个例子可以清楚地解释什么? 我的困惑是关于 key,如下面的代码所示。 MyHomepage({Key key, this.title}) : super(key: key
我在我的 Android 应用程序中使用 GCM。要使用 GCM 服务,我们需要创建 Google API key 。因此,我为 android、服务器和浏览器 key 创建了 API key 。似乎
我想在 azure key 保管库中创建一个 secret ,该 key 将具有多个 key (例如 JSON)。 例如- { "storageAccountKey":"XXXXX", "Co
尝试通过带有 encodeforURL() 的 url 发送 key 时,我不断收到错误消息和 decodefromUrl() .代码示例如下。 这是我的入口页面: key = generateSec
是否有检查雪花变体字段中是否存在键的函数? 最佳答案 您可以使用 IS_NULL_VALUE 来查看 key 是否存在。如果键不存在,则结果将为 NULL。如果键存在,如果值为 JSON null,则
我正在尝试运行此命令: sudo apt-key adv --keyserver keys.gnupg.net --recv-keys 1C4CBDCDCD2EFD2A 但我收到一个错误: Execu
我有一个 csv 文件,我正在尝试对 row[3] 进行计数,然后将其与 row[0] 连接 row[0] row[3] 'A01' 'a' 'B02'
如何编写具有这种形式的函数: A(key, B(key, C(key, ValFactory(key)))) 其中 A、B 和 C 具有此签名: TResult GetOrAdd(string key
审查 this method我很好奇为什么它使用 Object.keys(this).map(key => (this as any)[key])? 只调用 Object.keys(this).ind
我有一个奇怪的情况。我有一个字典,self.containing_dict。使用调试器,我看到了字典的内容,并且可以看到 self 是其中的一个键。但是看看这个: >>> self in self.c
我需要在我的 Google Apps 脚本中使用 RSA-SHA256 和公钥签署消息。 我正在尝试使用 Utilities.computeRsaSha256Signature(value, key)
我是 React 的初学者开发人员,几天前我看到了一些我不理解的有趣语法。 View组件上有{...{key}},我会写成 key={key} ,它完全一样吗?你有链接或解释吗? render()
代理 key 、合成 key 和人工 key 之间有什么区别吗? 我不清楚确切的区别。 最佳答案 代理键、合成键和人工键是同义词。技术关键是另一个。它们都表示“没有商业意义的主键”。它们不同于具有超出
问题陈述:在 Web/控制台 C# 应用程序中以编程方式检索并使用存储在 Azure Key Vault 中的敏感值(例如数据库连接字符串)。 据我所知,您可以在 AAD 中注册应用,并使用其客户端
问题陈述:在 Web/控制台 C# 应用程序中以编程方式检索并使用存储在 Azure Key Vault 中的敏感值(例如数据库连接字符串)。 据我所知,您可以在 AAD 中注册应用,并使用其客户端
我正在寻找 Perl 警告的解决方案 “引用键是实验性的” 我从这样的代码中得到这个: foreach my $f (keys($normal{$nuc}{$e})) {#x, y, and z 我在
我正在为 HSM 实现 JCE 提供程序 JCE中有没有机制指定 key 生成类型例如: session key 或永久 key KeyGenerator keygen = KeyGener
我在 Facebook 上创建了一个应用程序。我已经正确添加了 keyhash 并且应用程序运行良好但是当我今天来并尝试再次运行它时它给了我这个错误。 这已经是第二次了。 Previsouly 当我收
我是一名优秀的程序员,十分优秀!