【p2p、分布式,区块链笔记 DAM】GUN/SEA(Security, Encryption, Authorization) 模块genkey

genkey

generateAppKey.js

const SEA = require('gun/sea');// 生成密钥对
SEA.pair().then((pair) => {// 输出提示信息console.log('This is your secret app key pair.\nAdd this to your .dotenv file:');// 将生成的密钥对转换为 JSON 格式并输出console.log(`APP_KEY_PAIR='${JSON.stringify(pair)}'`);
});
  • 输出:
$ node ./generateAppKey.js
Hello wonderful person! :) Thanks for using GUN, please ask for help on http://chat.gun.eco if anything takes you longer than 5min to figure out!
This is your secret app key pair.
Add this to your .dotenv file:
APP_KEY_PAIR='{"pub":"B14-m6S3i1cgm9bJCsED0FsGbHiDlXJAiKK2OnrPSj0.axmMDTmbdAfU3SjJhgqOn6mH6jDUoazcQ_vHljstyuE","priv":"21kawgH1yBwDLSf4yh63A_AdAja4hh-Q5h_ob_LF-VE","epub":"Z-IWo4zkzXyEL5hWCmvQLY8aoxupbZmJZmKFMDhNJ0U.hoNigMrVpc2npPR17tjOyZchJKk1D8wlQKPCIKZNF_w","epriv":"UUO2sHWG1lrQLNr0t9ObSEHyiasCc_D2HdJS-Vw2FmI"}'
Done in 0.77s.

APP_KEY_PAIR

APP_KEY_PAIR='{"pub":"B14...","priv":"21k...","epub":"Z-I...","epriv":"UUO..."}'

总结

密钥类型功能对比表

密钥类型作用使用场景是否公开说明
pub身份验证、消息签名验证用于验证签名和公开身份可以公开用于确认数据是否由密钥对的拥有者签名。
priv消息签名签署消息、身份认证不可公开pub 的配对私钥,用于对消息签名;一旦泄露可能导致身份伪造。
epub数据加密、公钥加密安全数据传输、密钥交换可以公开用于加密数据,与 epriv 配对;确保对称密钥安全共享。
epriv数据解密解密接收到的加密数据不可公开epub 的配对私钥,用于解密加密的数据;必须严格保密。

使用示例

  • epub / epriv 用于 数据加密解密。假设已经在 .env 文件中保存了密钥对:
APP_KEY_PAIR='{"pub":"B14...","priv":"21k...","epub":"Z-I...","epriv":"UUO..."}'
  • 然后在代码中读取密钥对并加解密数据:
const SEA = require('gun/sea');
const pair = JSON.parse(process.env.APP_KEY_PAIR);// 数据加密
async function encryptMessage(message, recipientEpub) {const encrypted = await SEA.encrypt(message, recipientEpub);return encrypted;
}// 数据解密
async function decryptMessage(encryptedMessage) {const decrypted = await SEA.decrypt(encryptedMessage, pair.epriv);return decrypted;
}// 示例用法
const recipientEpub = 'Z-IWo4zkzXyEL5hWCmvQLY8aoxupbZmJZmKFMDhNJ0U.hoNigMrVpc2npPR17tjOyZchJKk1D8wlQKPCIKZNF_w';
const message = 'Hello, secure world!';
encryptMessage(message, recipientEpub).then((encrypted) => {console.log('Encrypted Message:', encrypted);decryptMessage(encrypted).then((decrypted) => {console.log('Decrypted Message:', decrypted);});
});

server

  1. 启动服务:通过 Express 和 GUN 创建服务器。
  2. GUN 实例配置
    • 验证所有进入的 GUN 消息是否带有有效的 JWT。
    • 自动将应用本身认证为 GUN 用户,使其可以管理数据。
  3. API 路由
    • /api/certificates:允许用户获取证书,以限制其对特定数据路径的访问。
    • /api/tokens:为用户生成 JWT 令牌,用于请求认证。

引入必要的模块

// 引入必要的模块
const express = require('express');       // 用于创建 HTTP 服务器
const cors = require('cors');             // 处理跨域请求
const jwt = require('jsonwebtoken');      // 用于生成和验证 JSON Web Token (JWT)
let Gun = require('gun');                 // GUN 去中心化数据库
const SEA = require('gun/sea');           // GUN 的加密模块 (SEA)// 引入 bullet-catcher 模块以增强错误处理
require('bullet-catcher');

初始化 Express 应用和读取配置

// 初始化 Express 应用和读取配置// 读取环境变量(.env 文件中的配置)
require('dotenv').config();const app = express();
// 设定端口号,默认为 8765
const port = process.env.PORT || 8765;// 读取 GUN 密钥对和 JWT 密钥
const APP_KEY_PAIR = JSON.parse(process.env.APP_KEY_PAIR); // GUN 应用密钥对
const APP_TOKEN_SECRET = process.env.APP_TOKEN_SECRET;     // 用于 JWT 的密钥

Web 服务配置

// 允许 GUN 提供其 Web 服务
app.use(Gun.serve);// Gun.serve:允许 GUN 提供 HTTP 服务,从而启用 WebSocket 通信// 创建 HTTP 服务器并监听端口
const server = app.listen(port, () => {console.log(`App listening at http://localhost:${port}`);
});/*** 验证 GUN 消息中的 JWT 是否有效* @param {Object} msg - GUN 消息对象* @returns {Boolean|Error} - 返回 true 如果验证成功,否则返回错误*/
function verifyToken(msg) {// 检查消息头中是否有 accessTokenif (msg?.headers?.accessToken) {try {// 验证 accessToken 是否有效jwt.verify(msg.headers.accessToken, APP_TOKEN_SECRET);return true; // 如果验证通过,则返回 true} catch (err) {const error = new Error('Invalid access token'); // 如果验证失败,抛出错误// 检查是否是 Token 过期错误if (err.name === 'TokenExpiredError') {// 如果需要,可以在这里实现自动刷新 token 的逻辑error.expiredAt = err.expiredAt;}return error;}}// 如果消息中没有 accessToken,则返回 falsereturn false;
}// 初始化 GUN 实例,启用 JWT 验证
const gun = Gun({web: server,     // 使用刚创建的 HTTP 服务器isValid: verifyToken, // 验证传入消息的 accessToken
});// 同步所有数据
gun.on('out', { get: { '#': { '*': '' } } });/*** 将应用本身授权为 GUN 用户* 以便应用可以使用 GUN 网络存取数据*/
gun.user().auth(APP_KEY_PAIR, ({ err }) => {if (err) {// 如果认证失败,输出错误信息console.error(err);}
});

API 路由

// 允许 Express 解析 JSON 请求体
app.use(express.json());// 如果需要允许跨域访问,可以启用 CORS
// app.use(cors());

创建授权证书的 API

/*** 创建授权证书的 API 路由 SEA.certify* 允许用户获取权限证书,以限制其修改特定数据路径*/
app.post('/api/certificates', async (req, res) => {// 从请求体中获取用户名和用户的公钥const { username, pub: userPubKey } = req.body;// 定义访问控制策略const policy = [// 允许用户添加和编辑他们的 profile 数据{ '*': 'profiles', '+': '*' }];// 设置证书的过期时间为 2 小时const expiresAt = Date.now() + 2 * 60 * 60 * 1000;try {// 使用 GUN 的 SEA 模块生成授权证书const certificate = await SEA.certify([userPubKey],     // 被授权的用户公钥policy,           // 访问控制策略APP_KEY_PAIR,     // 应用的密钥对null,             // 回调函数 (可选){expiry: expiresAt,   // 设置证书的过期时间block: 'blocked',    // 可以定义阻止的路径 (可选)});// 如果证书生成成功,发送响应console.log(`Successfully created certificate for ${username}`);res.status(201).send({ certificate, expires_at: expiresAt });} catch (err) {// 如果生成证书时出错,返回错误信息console.error(`Error creating certificate for ${username}:`, err);res.status(500).send({ error: err.message });}
});

生成 JWT 令牌的 API

/*** 生成 JWT 令牌的 API 路由* 用户可以通过此路由获取访问令牌*/
app.post('/api/tokens', async (req, res) => {// 从请求体中获取用户名和用户公钥const { username, pub } = req.body;// 创建 JWT,设置有效期为 1 小时const token = jwt.sign({ username, pub }, APP_TOKEN_SECRET, {expiresIn: '1h', // 令牌在 1 小时后过期});// 返回生成的 accessTokenres.status(201).send({ accessToken: token });
});

测试

  1. 启动服务器:
    node ./server.js
    
  2. 使用 curl 或 Postman 测试 /api/certificates
    curl -X POST http://localhost:8765/api/certificates \
    -H "Content-Type: application/json" \
    -d '{"username": "alice", "pub": "yourUserPubKey"}'
    
  3. 测试 /api/tokens
    curl -X POST http://localhost:8765/api/tokens \
    -H "Content-Type: application/json" \
    -d '{"username": "alice", "pub": "yourUserPubKey"}'
    

CG

  • https://github.com/amark/gun/wiki/SEA.certify#some-examples::Custom personal profiles in a public room

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/470322.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

什么是RAG? LangChain的RAG实践!

1. 什么是RAG RAG的概念最先在2020年由Facebook的研究人员在论文《Retrieval-Augmented Generation for Knowledge-Intensive NLP Tasks》中提出来。在这篇论文中他们提出了两种记忆类型: 基于预训练模型(当时LLM的概念不像现在这么如日中天&#xff0…

Vite初始化Vue3+Typescrpt项目

初始化项目 安装 Vite 首先,确保你的 Node.js 版本 > 12.0.0。然后在命令行中运行以下命令来创建一个 Vite Vue 3 TypeScript 的项目模板: npm init vitelatest进入项目目录 创建完成后,进入项目目录: cd vue3-demo启动…

nginx部署H5端程序与PC端进行区分及代理多个项目及H5内页面刷新出现404问题。

在项目中会碰见需要在nginx代理多个项目,如果在加上uniapp开发的H5端的项目,你还要在nginx中区分PC端和手机H5端,这就会让人很头大!网上大部分的资料都是采用在nginx的conf配置文件中添加区分pc和手机端的变量例如:set…

软件测试项目实战

软件测试是使用人工或者自动的手段来运行或者测定某个软件系统的过程,其目的在于检验它是否满足规定的需求或弄清预期结果与实际结果之间的差别。 在软件投入使用前,要经过一系列的严格测试,才能保证交付质量。 一、引言 1.编写目的 本文档…

2024开发者浏览器必备扩展,不允许还有人不知道~

在开发过程中,优秀的扩展工具能够极大提升我们的工作效率,简化工作流程,并使得在浏览器中的开发和调试变得更加便捷。 根据市场占比,Chrome、Safari、Edge、Firefox、Opera 是前五大浏览器,其中Chrome浏览器占据了领先…

分享一个傻瓜式一键启动的加速器

主要发现开通一个号能电脑手机互通,原来电脑手机各一个加速器钱包在滴血。。。一个月也很便宜差不多二十多 链接放这了,有需要自提:首页-小熊加速器http://xxjsq.co/ytfa

TDesign了解及使用

文章目录 1、概述2、快速开始2.1使用 npm 安装2.2通过 浏览器引入 安装2.3、使用 3、简单案例3.1 路由创建3.2、 页面创建3.3、 Table组件3.4、序号展示3.5、 图片展示及预览3.6、 性别字段处理 1、概述 TDesign 是腾讯推出的设计系统,旨在提供一致的设计语言和视觉…

11Java面向对象高级(篇2,Java程序的核心套路!!!!)

更多java知识请点击上面专栏!!! 修道之始: 01Java基础入门(纯小白也能入门,速通Java,知识点归纳超级全面!!!2024版后端成仙起始篇!!!…

定时器(QTimer)与随机数生成器(QRandomGenerator)的应用实践——Qt(C++)

一、QTimer与QRandomGenerator (一)QTimer(定时器)[2] QTimer类为定时功能提供了一个高级编程接口。在使用QTimer时,实例化一个QTimer对象并将其timeout()发射信号与合适的信号槽相连接。通过调用QTimer的start()函数…

翼鸥教育:从OceanBase V3.1.4 到 V4.2.1,8套核心集群升级实践

引言:自2021年起,翼鸥教育便开始应用OceanBase社区版,两年间,先后部署了总计12套生产集群,其中核心集群占比超过四分之三,所承载的数据量已突破30TB。自2022年10月,OceanBase 社区发布了4.2.x 版…

AI绘画经验(stable-diffusion)

提示词理解 总的 AI绘画的优点是【想象力】,而不是自然语言的精确描述。 AI绘画只能控制【主体】和【风格】,姿势,表情,装饰,手指都太过于详细了。这也是【人类画师的魅力】 准确描述是徒劳的,只能通过【…

使用支付宝沙箱完成商品下单

使用支付宝沙箱完成商品下单 一:效果展示: 二:代码实现 1:准备工作: 申请支付宝沙箱账户: 登录 - 支付宝 然后要下载密钥密钥工具来生成密钥; 2:流程分析: 先是用户…

Linux设置socks代理

公司里绝大多数主机已经禁止外网访问,仅保留一台主机设置socks作为代理服务器。如下为对socks这一概念的学习整理 什么是socks 是OSI模型下会话层的协议,位于表示层与传输层之间,作用是: exchanges network packets between a c…

以往运维岗本人面试真题分享

以下是本人面试运维岗的一些面试经历,在此做个记录分享 目录 TCP/IP三次握手 IPtables IPtables四表五链都是什么? nat端口如何做? 开放本机的80端口该如何做? 如何在单用户模式下引导Centos? nginx轮询模式都有…

【Hadoop实训】Hive 数据操作①

目录 一、准备文件 1、创建表 2、 数据映射 二、HIVE的数据操作 1、基本查询 a、全表查询 b、选择特定字段查询 c、查询员工表总人数 d、查询员工表总工资额 e、查询5条员工表的信息 2、Where条件查询 a、查询工资等于5000的所有员工 b、查询工资在500到1000的员工信息 …

3.5【数据库系统】ER图

2、实体之间的关系 下面主要针对两个实体间的关系进行介绍 (a)一对一联系(1:1)如班级和班长,一个班级只有一个班长,一个班长只能在一个班级任职。 (b)一对多联系(1&#…

笔记 | image may have poor performance,or fail,if run via emulation

在Docker Desktop中现象如图: 当你运行 AMD64 平台代码时(Intel 和 AMD 芯),你的 Mac 必须模拟其CPU架构(因为你自身是ARM)。这通常会非常吃性能。 Docker Desktop 警告你在模拟 Intel/AMD x64 CPU 时性能可…

想租用显卡训练自己的网络?AutoDL保姆级使用教程(PyCharm版)

各位小伙伴们大家好~ 不知道各位同学在科研过程中是否有这样的苦恼 电脑无显卡。难不成我要用CPU跑实验吗?救救我吧电脑显卡算力太低。训练过程慢慢慢慢慢,等半天都出不来结果电脑显卡显存不够,batchsize稍微高一点点,就要爆显存…

Linux相关习题-gcc-gdb-冯诺依曼

1.将一个test.c文件仅仅进行汇编而不生成可执行程序的命令是? A.gcc -S test.c B.gcc -E test.c C.gcc -c test.c D.gcc test.c gcc常见选项: -c 汇编完成后停止,不进行链接 -E 预处理完成后停止,不进行编译 -S 编译完成后停止…

计算机毕业设计必看必学35755flask旅游景区热度可视化平台原创定制程序,java、PHP、python、小程序、文案全套、毕设成品等

flask旅游景点热度可视化平台 摘 要 信息化社会内需要与之针对性的信息获取途径,但是途径的扩展基本上为人们所努力的方向,由于站在的角度存在偏差,人们经常能够获得不同类型信息,这也是技术最为难以攻克的课题。针对旅游景点热度…