NodeJS 如何只用一个密码对字符串进行加密和解密?[已关闭]

6l7fqoea  于 2023-01-12  发布在  Node.js
关注(0)|答案(1)|浏览(128)

已关闭。此问题为opinion-based。当前不接受答案。
**想要改进此问题吗?**请更新此问题,以便editing this post可以用事实和引文来回答。

昨天关门了。
这篇文章是22小时前编辑并提交审查的。
Improve this question

编辑:答案在底部

两个应用程序共享一个数据库。我希望应用程序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"))

回答我

使用“加密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"
kiz8lqtg

kiz8lqtg1#

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应该知道私钥。

相关问题