node应用授权-RSA非对称加密授权

安装依赖包

npm i node-rsa

 

生成RSA公私钥对
const NodeRSA = require('node-rsa')

function createKey() {
  const key = new NodeRSA({ b: 512 }) // 生成512位密钥
  const RE = /(-----(BEGIN|END)\s\S*\sKEY-----)|[\n\r]/g // 这里对格式进行正则处理方便存表,也可以不处理选择其他方式保存 如:.pem文件格式存储密钥
  return {
    pubkey: key.exportKey('pkcs8-public').replace(RE, ''),
    prikey: key.exportKey('pkcs8-private').replace(RE, '')
  }
}

console.log('rsaKey:', createKey())
/*
rsaKey: {
  pubkey: 'MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAIJqu1yg3UM1QbuVPYpO9PJzao9ZEmuNJ4cc5KHltlypsJfi1737BiL17DR6TNP6sfRAPo0ftWn7/byW7Qcq37kCAwEAAQ==',
  prikey: 'MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAgmq7XKDdQzVBu5U9ik708nNqj1kSa40nhxzkoeW2XKmwl+LXvfsGIvXsNHpM0/qx9EA+jR+1afv9vJbtByrfuQIDAQABAkAWRRF/bLy7uEFkPcTHdFoheJHuroAVu4HPcaCdALPWOKa2hSkWbtzmh4ao8quzbveEm6rZy4fpVwWFb26zNvBtAiEA8/rfTDuhWpuyVhOQntGGcbIZVBJeLwZIRLTGlvPdGZcCIQCI15P9cEedFb7zJwkv9osmiH1xjIWBnIbArvGGiKnbLwIgLV+Of4Lncw5ZkCB7WM3mjuZsR3JTCbPFZOGpvREFIWkCIQCABslzjQ/DPOwoy7XBxPVNONe8W48ww0Qjk8luaAAaiwIgBbnnynXzuT58JsL61TvNKxf/n/mD2Mf9YqMCCLEW4bQ='
}
*/

 

公钥加密 应用方 service层存好被分配的 公钥(pubkey)、应用标识(appId),并通过该 公钥 进行数据加密并携带该 应用标识 发送给 服务方
const nodersa = new NodeRSA(pubkey, 'pkcs8-public')
const encryptStr = nodersa.encrypt(new Date().getTime(), 'base64') // 比如拟个 encryptStr 字段,获取当前时戳(1642561750840)并加密赋值给它 发给服务方

 

私钥解密 服务方 接收到 加密参数(encryptStr)、应用标识,并进行解密
const priKey = new NodeRSA(prikey, 'pkcs8-private') // 配置表通过该 应用标识(一般uuid随机字符串或表id)得到对应 私钥
const decryptStr = priKey.decrypt(encryptStr, 'utf8') // 并通过该 私钥(prikey) 解密得:1642561750840

 

-----------------附-------------------

 

可能遇到的问题:

1. 应用方 通过URL query传参base64密文,服务方 接收时 ‘+’ 变 空格 ?

=> 服务方 替换空格为‘+’之后再解密 encryptStr.replace(/\s/g, '+')

2. uuid生成 应用标识

const UUID = require('uuid') // npm i uuid

// 随机uuid
function UUIDV4() {
  return UUID.v4().replace(/\-/g, '') // 这里去了下空格,可以选择不去
}

console.log('uuid:', UUIDV4()) // uuid: 9289369802684e0cbc57c1001ab9bc27
View Code

 

返回值场景:

1. 应用已授权

2. 授权已到期

3. 应用未授权:通过appId或其他应用标识未能从数据库-应用授权表中查询到记录

4. 应用授权失败:解密失败、本次授权过期(通过时戳,设置应用本次 授权过期 时间)
响应结果

 

参照表:

CREATE TABLE `application_accredit` (
  `id` bigint(20) NOT NULL AUTO_INCREMENT COMMENT '应用授权配置id',
  `auid` varchar(255) DEFAULT NULL COMMENT '应用标识',
  `appName` varchar(255) DEFAULT NULL COMMENT '应用名称',
  `appKey` longtext COMMENT '应用key',
  `appSecret` longtext COMMENT '应用secret',
  `validTime` datetime DEFAULT NULL COMMENT '有效期',
  `creator` varchar(255) DEFAULT NULL COMMENT '授权人',
  `createTime` datetime DEFAULT NULL COMMENT '创建时间',
  `updateTime` datetime DEFAULT NULL COMMENT '修改时间',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 COMMENT='应用授权配置';
应用授权配置表

 

posted @ 2022-01-19 13:57  _senjer  阅读(397)  评论(0)    收藏  举报