【问题标题】:How do I encrypt and decrypt a string with only a passphrase? [closed]如何仅使用密码加密和解密字符串? [关闭]
【发布时间】:2023-01-12 15:54:33
【问题描述】:

编辑:答案在底部

两个应用程序共享一个数据库。我希望应用程序 A 能够将“消息”放入应用程序 B 可以读取的数据库中。

我希望消息以某种方式加密,这样有权访问数据库的人将很难解释消息,除非他们获得密钥(应用程序 A 和 B 共享)。

如何使用密码加密字符串,以便不同的应用程序可以使用相同的密码对其进行解密?

export function encrypt(unencrypted: string, key: string): string {
    // what do I write here?
}

export function decrypt(encrypted: string, key: string): string {
}

const someMessage = "Hello world!"
const encrypted = encrypt(someMessage, "somekey")

// print something unreadable
console.log(encrypted)

// print something unreadable, again
console.log(decrypt(encrypted, "wrongkey"))

// print "Hello world!"
console.log(decrypt(encrypted, "somekey"))

回答

使用“crypto-js”

yarn add crypto-js && yarn add -D @types/crypto-js

然后我可以这样编码:

import cjs from "crypto-js"

function encrypt(data: string, key: string): string {
    return cjs.AES.encrypt(data, key).toString()
}

function decrypt(data: string, key: string): string {
    return cjs.AES.decrypt(data, key).toString(cjs.enc.Utf8)
}

const data = "somethingsecret"
const encrypted = encrypt(data, "somekey")
console.log(encrypted)
const decrypted = decrypt(encrypted, "somekey")
console.log(decrypted) // <-- "somethingsecret"

【问题讨论】:

  • 你为什么不使用已经建立的加密方法?
  • 公平警告这个问题是自以为是-- 正如 vera 提到的,您可以使用多种加密方法。为了让您走上正轨,根据您的代码,您正在寻找对称(1 密钥)加密——AES 可能会有所帮助。
  • 令人难以置信的是,没有人可以提供一个简单的示例来说明如何使用密码来加密字符串。加密模块可能是我需要的,但我宁愿不必处理要选择的算法、初始化向量等。它应该是 2 行代码。 gpg 我可以用密码加密文件,为什么在 Node 中做同样的事情这么难?
  • 对于那些将此问题标记为基于意见的人,请帮个忙,在地上挖一个洞,然后躺在里面。除了“1+1 是多少?”以外的所有问题固执己见。

标签: node.js typescript encryption


【解决方案1】:

JSEncrypt 是用于加密和解密消息的 RSA 算法的 JavaScript 实现。它可用于 Web 应用程序中,在浏览器中对数据进行加密和解密,而无需向服务器发送敏感信息。

这是一个例子:

import JSEncrypt from 'jsencrypt'

export function encrypt(unencrypted: string, key: string): string {
    const encryptor = new JSEncrypt();
    encryptor.setPublicKey(key);
    return encryptor.encrypt(unencrypted);
}

export function decrypt(encrypted: string, key: string): string {
    const decryptor = new JSEncrypt();
    decryptor.setPrivateKey(key);
    return decryptor.decrypt(encrypted);
}

const someMessage = "Hello world!"

const publickey = `-----BEGIN PUBLIC KEY-----
MIGeMA0GCSqGSIb3DQEBAQUAA4GMADCBiAKBgGVUw0bda97A9udvJmWRm9BlyP1Y
u2eW43if5lvfzb5BQ/3aykP0amOY+GIvkEffu9XwnCnfUndtn2rtKMC2uY9V6QmX
htsCAoouDZAGUvmWUhfNnoRrvfxElzCssUhVo2L5nodSyUIx+fN3q2ltB0NGN3Kl
I5v0U5u0kUwioj9TAgMBAAE=
-----END PUBLIC KEY-----`;

const encrypted = encrypt(someMessage, publickey)
console.log(encrypted)

const privatekey = `-----BEGIN RSA PRIVATE KEY-----
MIICXAIBAAKBgGVUw0bda97A9udvJmWRm9BlyP1Yu2eW43if5lvfzb5BQ/3aykP0
amOY+GIvkEffu9XwnCnfUndtn2rtKMC2uY9V6QmXhtsCAoouDZAGUvmWUhfNnoRr
vfxElzCssUhVo2L5nodSyUIx+fN3q2ltB0NGN3KlI5v0U5u0kUwioj9TAgMBAAEC
gYAiSnby6kdw0Fg9pY2W3ZmfAnLr2TVCLvu3fFUWTjxv3+JEa9/68yF1pvSXNYVb
7UjBc3VFbj+YDs7d/nfGD4/nlb4ckHGvBLTUMEIe5KlTTev7txd8aBoJBEIZyQn/
TFDU24zCqQofqGu4PeE3M1dlfhpKj6V4+1hTvRjnmH2yYQJBALc9a8YQZQQLQnhb
KeYzYP/7rY8J5PiUccYN5PEUnZC0vqY5ixuyT9mKTjQLeIR0JrGBfYPYapMElnx8
7YwOT7kCQQCNkTPe055vIo5RLVdjO1KZcHXMUHqcBO/WkrzLbakC2OGjOuWpnCT9
Xof+7WHE7E5cJxgVOCmu3MFsG5xH4tVrAkEAsR3idaFVMvJ7PoDH4CYbhXNNEKy8
sPYzfv/hIpINt1ity1hluNDDU//WlYHc7RKkcAE9RFrEsPTHTO8oYa9XqQJAJJwM
Qe+P5UWWcD+9fZf1wGBo1jFpw7czHtZLpH/zWR0lHMU6ZyZOGoe7u50/z2Ec0o/5
lmMzxFiqXH63Z4+tiQJBAI/KtmzZPZANMs5KoPu0mJ20A++OyelvHIvvdQhFWqP8
oq01z3LFaVENsBKxmTYgMzDlYRYJAoPMBQqDfBnOmCU=
-----END RSA PRIVATE KEY-----`;

const decrypted = decrypt(encrypted , privatekey)
console.log(decrypted)

您可以使用 https://travistidwell.com/jsencrypt/demo/ 之类的网站来生成公钥和私钥,或者使用 openssl 来生成它们。

encrypt 函数将未加密的消息和公钥作为输入,并返回加密的消息。 decrypt 函数将加密消息和私钥作为输入,并返回未加密的消息。

应用程序 A 应该知道公钥,而应用程序 B 应该知道私钥。

【讨论】:

  • 当 Node 提供了一个内置的 crypto 模块来执行 RSA 加密/解密时,绝对不需要为此包含任意依赖项。
  • 没有注意到 node.js 标签。我提供的解决方案适用于任何 JavaScript 运行时,即网络。
  • 感谢您尝试回答,至少 :)
最近更新 更多