资讯专栏INFORMATION COLUMN

浏览器端rsa加密方案node-forge

zhangxiangliang / 3462人阅读

摘要:不能把公钥当私钥,私钥当公钥使用,因为私钥可以提取出公钥。私钥加密的过程称为签名,因为公钥是公开的,谁都能解密,所以无法保密信息,只能用于验证签名者是私钥持有人。一般也只用来加密密码。

并没有体验多少库,只看了一个npm里最多人用的一个库:

node-forge : 接口文档

rsa小知识

加密解密用的key是成对的,分别称为私钥和公钥,私钥必须存放在服务器等别人无法获取到的地方,公钥可以公开,谁都可以获取。

不能把公钥当私钥,私钥当公钥使用,因为私钥可以提取出公钥。

公钥加密的内容,只有私钥能解密,公钥不能解密自己加密的内容。

私钥加密的过程称为签名(sign),因为公钥是公开的,谁都能解密,所以无法保密信息,只能用于验证签名者是私钥持有人。

前端代码
// 他们github有提供 forge.min.js , 不用webpack的项目也可以直接引用
import forge from "node-forge"

const message = "要加密我了" // 原文长度有限制,而且中文还要url编码,所以不能加密太长的字符串。一般也只用来加密密码。
const publicKey = "-----BEGIN PUBLIC KEY-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCqM+l9ZWy1Frt6felFFLmfZNls
VbU1dKpF8Rx83FtKCsztO5k/iV5N9BbfHFUg9Y40b/EK2j/BPc1xlLYAHMXn6563
XCwZ4IuCxvfOwz9qT9gkKBxkI5b0rnikkSWTGlJEk2PdZ7Plc73Fa+bx3PvuKvMd
cKWvd80+vt9+b/7hrwIDAQAB
-----END PUBLIC KEY-----"
const publicK = forge.pki.publicKeyFromPem(publicKey)
const encrypted = publicK.encrypt(encodeURIComponent(message), "RSA-OAEP") // 经过url编码,后端解密后需要url解码
console.log("密文:", encrypted) // 虽然乱码,但可以直接发给后端解密

ps. 以上代码建议使用try,因为加密中如果出现问题,会throw Error

nodejs端代码
const forge = require("node-forge")
const privateKey = "-----BEGIN PRIVATE KEY-----
MIICdgIBADANBgkqhkiG9w0BAQEFAASCAmAwggJcAgEAAoGBAKoz6X1lbLUWu3p9
6UUUuZ9k2WxVtTV0qkXxHHzcW0oKzO07mT+JXk30Ft8cVSD1jjRv8QraP8E9zXGU
tgAcxefrnrdcLBngi4LG987DP2pP2CQoHGQjlvSueKSRJZMaUkSTY91ns+VzvcVr
5vHc++4q8x1wpa93zT6+335v/uGvAgMBAAECgYArxUnou6qnL39rUvIol9ncyfy4
RZpicuxPLGCdI7Y+ZmSpJciVdGhSN9Gh8xFZdozpo1gj6Fi5A4HQEeR0RvIF9Rgh
ERblj1rRWqxPcsIddOO9VaknQPICWKqEW9+E1bEcyNUblCHA4LGyQwmuEFUb/Tkj
xAghIHuEBCe0GFiVwQJBAN5i5QSoOIpdFHA0c981E4VhHc/muXwjx1HfE1pcuuFb
Ty3OwEoZdFp3LIjBnBkPRneLTNjo5WTIwrmfsy6VDF8CQQDD7c6d/nKiJwIESlr+
/idqXAPNR/iS1YX3Nqtk9jgrgf5zULHr2nbk7MDas5S9Z9XPdUmxtnP44dhoGvDk
zyyxAkB7XBxyQuZqSkvGGjKUhJq5iC/DXddSd35fegEARSQdUktPu7qK4Cfc7vKz
QcLXW9PZCFqukDJ/f6YU1fPNSTy9AkADQ78hms/GK+g4shR6EzoM56OYlA5sQ+qL
h/mrIP8mmm/m8/1C9MzuW5OLEVr1HPnPDyE/OM8N4pV8hpZk+Z7BAkEAzaFstazA
xLzZOBWhvOzzo722glZ7HVezhMocLu7Y3EOXP/nbx09JpU3U7Egp5UVp0aiknh/Q
ez4Cc4ksMedxdA==
-----END PRIVATE KEY-----
"
const privateK = forge.pki.privateKeyFromPem(privateKey)
const decrypted = privateK.decrypt(encrypted, "RSA-OAEP") // encrypted 为前端传过来的密文
console.log("原文:", decodeURIComponent(decrypted)) // decrypted 为原文

ps. 以上代码建议使用try,因为解密中如果出现问题,会throw Error

ps. 以上例子用了RSA-OAEP规则,其实rsa还有很多加密规则,我粗略查了一下,据说RSA-OAEP是目前比较新的方式,另外有一些旧的规则已经不推荐使用了,留着只是为了向上兼容。没有深入查下去,因为我怕接下来要研究密码学了...

ps. 如果觉得加密后的字符串是乱码不好看,或者担心传输会出问题,可以使用base64转一下,服务端接收到则先解析base64再解密。

生成密钥公钥对
const forge = require("node-forge")
const { rsa, publicKeyToRSAPublicKeyPem, privateKeyToPem } = forge.pki
rsa.generateKeyPair({ bits: 2048, workers: 2 }, function (err, keypair) {
  if (err) {
    return
  }

  // 这里就生成了字符串的公钥和密钥了,可以把生成结果保存起来
  console.log({
    publicKey: publicKeyToRSAPublicKeyPem(keypair.publicKey, 72).replace(/
/g, ""),
    privateKey: privateKeyToPem(keypair.privateKey, 72).replace(/
/g, "")
  })
})

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/105876.html

相关文章

  • 一套简单的基于 RSA + AES 加密机制的前解决方案

    摘要:前言因公司现有后台管理系统项目需对部分网络请求接口的重要数据进行加密,整合了一套简单的基于加密机制的前端解决方案。用户已登录成功,页面刷新后将会重新生成,这时候需从中获取并和上传后端,后端重新绑定和。 前言 因公司现有后台管理系统项目需对部分网络请求接口的重要数据进行加密,整合了一套简单的基于 RSA + AES 加密机制的前端解决方案。 参考文献: crypto 廖雪峰 crypt...

    Travis 评论0 收藏0
  • 登陆认证、web api接口调用、支付接口调用等场合经常涉及到:md5、sh、 rsa等算法

    摘要:简介地址实际项目中的登陆认证接口调用支付接口调用等场合经常涉及到等算法。各大银行接口中经常使用算法对调用接口参数进行签名防篡改。使用端见端见特点便于理解,使用广泛。这就使加密的计算量很大。对方收到信息后,用不同的密钥解密并可核对信息摘要。 PHP-RSA简介 github 地址 https://github.com/lmxdawn/PH... 实际项目中的登陆认证、web api接口调...

    Bryan 评论0 收藏0
  • 登陆认证、web api接口调用、支付接口调用等场合经常涉及到:md5、sh、 rsa等算法

    摘要:简介地址实际项目中的登陆认证接口调用支付接口调用等场合经常涉及到等算法。各大银行接口中经常使用算法对调用接口参数进行签名防篡改。使用端见端见特点便于理解,使用广泛。这就使加密的计算量很大。对方收到信息后,用不同的密钥解密并可核对信息摘要。 PHP-RSA简介 github 地址 https://github.com/lmxdawn/PH... 实际项目中的登陆认证、web api接口调...

    Charles 评论0 收藏0
  • 登陆认证、web api接口调用、支付接口调用等场合经常涉及到:md5、sh、 rsa等算法

    摘要:简介地址实际项目中的登陆认证接口调用支付接口调用等场合经常涉及到等算法。各大银行接口中经常使用算法对调用接口参数进行签名防篡改。使用端见端见特点便于理解,使用广泛。这就使加密的计算量很大。对方收到信息后,用不同的密钥解密并可核对信息摘要。 PHP-RSA简介 github 地址 https://github.com/lmxdawn/PH... 实际项目中的登陆认证、web api接口调...

    Half 评论0 收藏0
  • Swoole 源码分析——Server模块之OpenSSL (上)

    摘要:另一方比如小明得到公钥之后,双方就可以通信。然而,中间人还是可能截获公钥,然后自己弄一对秘钥,然后告诉小明说是小红的公钥。这样,小亮在签署小红的身份证的时候,可以在小红身份证后面附上自己的身份证。一般来说,自签名的根身份证用于公司内部使用。 前言 自从 Lets Encrypt 上线之后,HTTPS 网站数量占比越来越高,相信不久的未来就可以实现全网 HTTPS,大部分主流浏览器也对 ...

    ky0ncheng 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<