node ~ zip压缩 文件加密

news2025/1/16 20:11:50

我们知道zip压缩,文件加密都是基于http的,下面我用用node实现着几个功能

zip压缩/解压

let zlib = require('zlib'); // 核心
let path = require('path');
let fs = require('fs');

// 压缩流 将1.txt压缩成1.txt.gz
function gzip(source){ //source文件目录let gzip = zlib.createGzip(); // 转化流 可读可写fs.createReadStream(source).pipe(gzip).pipe(fs.createWriteStream(source+'.gz')); //读=>压缩=>写新的
}
//gzip(path.join(__dirname, '1.txt'));
//解压
function ungzip(source) {let ungz = zlib.createGunzip();fs.createReadStream(source).pipe(ungz).pipe(fs.createWriteStream(path.join(__dirname,path.basename(source,'.gz'))));
}
ungzip(path.join(__dirname, '1.txt.gz')) 

发送请求的时候会有字段Accept-Encoding: gzip, deflate, br 支持哪种压缩方式, 在写服务器的时候,浏览器会有个字段,响应头有Content-Encoding: gzip,浏览器会自动以这种方式解压,下面我们来实现下压缩功能

let http = require('http');
let url=require('url');
let path = require('path');
let fs = require('fs');
let zlib = require('zlib');
let server = http.createServer(function (req,res) {let {pathname} = url.parse(req.url,true);if(pathname === '/' || pathname === '\\') pathname = '\index.html';let p = path.join(__dirname,pathname);fs.stat(p,function (err,stat) {if(!err){let encoding = req.headers['accept-encoding'];if (encoding.match(/\bgzip\b/)){ //:,都叫边界res.setHeader('Content-Encoding','gzip');let gzip = zlib.createGzip();fs.createReadStream(p).pipe(gzip).pipe(res);} else if (encoding.match(/\bdeflate\b/)){res.setHeader('Content-Encoding', 'bdeflate');let deflate = zlib.createDeflate();fs.createReadStream(p).pipe(deflate).pipe(res);}else{fs.createReadStream(p).pipe(res);//不支持就原封不动的返还给客户端}}else{res.end();}})
})
server.listen(3000); 

文件加密

加密的过程是可逆的,但是MD5是不可逆的,加密有很多算法,例如对称加密,非对称加密(https),签名等,这种算法一般都是node内置的(crypto),这里我们只说用法

crypto crypto是node.js中实现加密和解密的模块 在node.js中,使用OpenSSL类库作为内部实现加密解密的手段 OpenSSL是一个经过严格测试的可靠的加密与解密算法的实现工具

散列(哈希)算法 加盐算法

散列算法也叫哈希算法,用来把任意长度的输入变换成固定长度的输出,常见的有md5,sha1等

let crypto = require('crypto'); // 常见的加密模块
// console.log(crypto.getHashes());
//1)md5 其实不叫加密 ,叫摘要算法, 特点不可逆,输出结果长度相等,内容不同输出的结果就不同,反之相同

let md5 = crypto.createHash('md5') // 创建一个算法,经常用这种方式传文件
md5.update('123456'); // update加密 把哪段文字加密
let result1 = md5.digest('hex');//base64/hex16进制
let md52 = crypto.createHash('md5') // 创建一个算法,经常用这种方式传文件
md52.update('1234567'); // update加密 把哪段文字加密
let result = md52.digest('base64');//base64/hex16进制
// 如果存的是密码 多次加密。 拖库 
//缺点加密文件,会把文件读取到内存中,在文件很大的时候一般分段读,
let fs = require('fs');
let str = fs.readFileSync(__dirname+'/index.html','utf8');
let md53 = crypto.createHash('md5');
md53.update(str);
let result2 = md53.digest('hex');
console.log(result2);

//客户端第二次请求文件,服务器会先判断加密是否一致,如果一致会返回304从缓存中读取,
let md54 = crypto.createHash('md5');
let rs = fs.createReadStream(__dirname + '/index.html',{highWaterMark:3});
rs.on('data',function (data) {md54.update(data); // update可以调用多次 data是buffer
});
rs.on('end', function (data) {console.log(md54.digest('hex'));
}) 

HMAC算法

可用的摘要算法,例如 sha1、md5、sha256

// ------------ 加盐算法
let crypto = require('crypto');
let hmac = crypto.createHmac('sha1', 'zdl'); //加zdl的味道zdl为一个字符串,用于指定一个PEM格式的密钥,PEM不同生成的秘钥也不同
hmac.update('123456');
let result = hmac.digest('hex');
console.log(result); 

但是以上客户端发送给乙方的时候还是会不安全,在发送的过程中有可能被劫持,我们可以用openssl genrsa -out rsa_private.key 1024 生成1024字节的秘钥,字节越多越安全

// PEM是OpenSSL的标准格式,OpenSSL使用PEM文件格式存储证书和密钥,是基于Base64编码的证书。
let fs = require('fs');
let pem= fs.readFileSync(__dirname+'/rsa_private.key');
let key = pem.toString('ascii');
let hmac = crypto.createHmac('sha1', key);
hmac.update('zdl');
let result = hmac.digest('hex');
console.log(result); 

对称加密

blowfish算法是一种对称的加密算法,对称的意思就是加密和解密使用的是同一个密钥。

缺点:对,名字有限制,最多接受14个字符

let crypto = require('crypto');
let fs = require('fs');
let key = fs.readFileSync(__dirname + '/rsa_private.key')
let cipher = crypto.createCipher('blowfish', key);
cipher.update('zdl');
let result = cipher.final('hex');
console.log(result);

//解密
let deciper = crypto.createDecipher('blowfish', key);
// 告诉他刚才加密的是hex
deciper.update(result,'hex');
let r = deciper.final('utf8');
console.log(r); 

非对称加密

公钥加密私钥解密

算公钥 openssl rsa -in rsa_private.key -pubout -out rsa_public.key

// 非对称加密
let crypto = require('crypto');
let fs = require('fs');
let public = fs.readFileSync(__dirname+'/rsa_public.key','utf8');
let private = fs.readFileSync(__dirname +'/rsa_private.key','utf8');
let result = crypto.publicEncrypt(public, Buffer.from('hello'));
let r = crypto.privateDecrypt(private, result);
console.log(r.toString()); 

相对安全,如果客户端给服务端加个凭证,这种情况需要加密后发送,之前可能写个算法,把当前字符串前几个后几个取出来中间做排序,然后拼回去,每段时间换一次~~~

签名会在cookie中解释

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[Android]View的事件分发机制(源码解析)

目录 1.分发对象-MotionEvent 2.如何传递事件 1.传递流程 2.事件分发的源码解析 3.主要方法: 4.事件传递中listener 5.滑动冲突如何用事件分发处理 1.分发对象-MotionEvent 事件类型有: 1.ACTION_DOWN-----手指刚接触屏幕 2.ACTION_MOVE------手…

ASIC和FPGA,选择哪种设计比较好?

很多人都觉得同样都是写Verilog的,ASIC和FPGA其实并没有什么区别,其实并不是这样。那么ASIC和FPGA,选择哪种设计比较好?接下来IC修真院就来为大家细细分析。 ASIC (Application Specific Integrated Circuit),即专用集…

盘点:2022年勒索金额超百万美元的攻击事件

1、哥斯达黎加政府 勒索赎金:2000万美元 这是2022年最受关注的攻击事件,因为这是一个国家首次宣布进入“国家紧急状态”以应对勒索软件攻击。调查显示,从4月中旬到5月初,27个政府机构成为第一波攻击活动的目标。国家财政部数TB数…

生物化学 SY001盘尼西林

盘尼西林的发现与作用原理 发现历史略 青霉素 青霉素Penicillinβ-内酰胺类抗生素(β-lactams)青霉素类抗生素水溶性好,血消除半衰期大多不超过2小时音译盘尼西林抑制胞壁粘肽合成酶,从而使细菌胞壁缺损…

MOS管的<控制电路>与<防反接电路>

为了方便记忆,我不管D与S,只说MOS管中的二极管方向。 另外G是控制端 这是一篇只管结果的文章,大家只要记住就行。 懂原理vs记结果 懂原理以分析一切现象,但每次使用都要分析一次; 记结果方便使用,但出现问题…

1.1.1-了解什么是计算机

文章目录1 什么是计算机2 计算机硬件3 计算机软件3.1 应用软件3.2 系统软件3.3 主流的电脑操作系统有哪些4 Linux系统4.1 Linux系统介绍4.1 Linux系统版本5 计算机语言5.1 机器语言5.2 汇编语言5.3 人机交互6 计算机操作命令-DOS命令1 什么是计算机 计算机全称:电子…

Java基础学习笔记(十二)—— 数据结构

数据结构1 栈2 队列3 数组4 链表5 二叉树5.1 二叉树5.2 二叉查找树5.3 平衡二叉树5.4 红黑树6 哈希表数据结构是计算机存储、组织数据的方式。是指相互之间存在一种或多种特定关系的数据元素的集合。通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率。…

【C++】stack queue priority_queue ...

🌈感谢阅读East-sunrise学习分享——stack & queue & 容器适配器 & prioity_queue & 反向迭代器 博主水平有限,如有差错,欢迎斧正🙏感谢有你 码字不易,若有收获,期待你的点赞关注&#x1f…

SAP ABAP增强 BADI的增强全解析

BADI的全称是Business Add-in,它的主要技术是基于ABAP的对象来实现增强。SAP中BADI的维护事务代码是SE18和SE19,SE18主要是创建及维护BADI对象,而SE19用于维护BADI的实例,即如何来实现BADI对象的功能。 SAP的BADI因系统版本的差别…

K8S Deployment 使用 更新 回滚 扩容

K8S Deployments 使用 & 更新 & 回滚 & 扩容 K8S Deployments 提供比 Replication Controller 、ReplicaSet 更高一级的抽象,也具备更丰富的功能。Deployment对象不仅创建pod,还确保集群中始终运行正确数量的pod,处理可伸缩性&a…

Esp8266+TFT太空人天气时钟

开源项目,只对动手能力有要求,有现成程序 b站演示视频: https://www.bilibili.com/video/BV1ND4y1W7oS/?spm_id_from333.999.0.0 效果图 模块和接线方法 使用ESP8266-12F模块,4M空间。OLED使用1.3寸IPS 240*240点阵彩屏,ST7789…

【Java集合】ArrayList源码分析

目录 一、ArrayList介绍 1.1 简介 1.2 继承体系 二、源码剖析 2.1 成员属性 2.2 构造方法 2.2.1 带int类型的构造方法:ArrayList(int initialCapacity) 2.2.2 无参构造方法:ArrayList() 2.2.3 Collection型构造方法:ArrayList(Collection c) …

flink规则引擎设计思路

在日常工作中我们经常收到一些诸如此类需求:“用户给点击了开屏广告,给用户下发私信”、“用户进入了推荐线,但在60秒内没有任何点击操作,弹框引导用户选择感兴趣的内容”、“用户点赞了某位作者的两篇以上的内容,但并…

C++入门----缺省参数和函数重载

C入门第一讲: 文章目录C入门第一讲:1.C关键字(C98)2.命名空间2.1命名空间的定义3.C的输入和输出4.缺省参数4.1缺省参数的概念4.2缺省参数的分类4.2.1全缺省参数4.2.2半缺省参数5.函数重载5.1函数重载的概念5.2C支持函数重载的原理…

在 SpringBoot 中 初步使用 MyBatis

这篇文章简单介绍如何初步使用MyBatis框架。MyBatis官网:mybatis – MyBatis 3 | 简介。本文中介绍MyBatis使用在SpringBoot中,Spring帮我们进行了管理,省去了获取sql的步骤。 什么是 MyBatis? MyBatis 是一款优秀的持久层框架&a…

XAML控件宽度为另一控件的一半、静态属性绑定、ObjectDataProvider

控件上当某些数据需要根据其他数据的变化而变化 很多时候,想让某个控件的宽度或者高度是另一个已有控件的一半,一开始打算使用ObjectDataProvider来实现,因为在控件上当某些数据需要根据其他数据的变化而变化时,可以使用ObjectDa…

Selenium实战【滑动验证码破解】【JAVA爬虫】

简介本文主要讲解,利用之前所学到的java selenium如何实战操作,浏览器控制鼠标,模拟人工操作滑动验证码。这里需要用javacv 的代码知识,用于计算图像中滑块需要移动的距离。实战目标网站:https://dun.163.com/trial/jigsaw操作流程…

【Java入门】Java注释和关键字

✅作者简介:CSDN内容合伙人、阿里云专家博主、51CTO专家博主、新星计划第三季python赛道Top1🏆 📃个人主页:hacker707的csdn博客 🔥系列专栏:Java入门 💬个人格言:不断的翻越一座又一…

mycat个人详谈

项目背景 现在业务想实现不同的用户分别看到不同的数据库,领导说用mycat中间件试试。没有接触过这个东西,刚拿到手直接头皮发麻,现在搞定了,索性就记录一下 Mycat数据库分库分表中间件 简介 阿里大牛开发的开源免费产品&#x…

设计模式——抽象工厂模式

文章目录1. 抽象工厂模式的定义2. 抽象工厂模式的类图3. 抽象工厂模式的作用4. 抽象工厂模式的实现1. 抽象工厂模式的定义 提供一个接口,用于创建相关或依赖对象的家族,而不需要明确指定具体类。 抽象工厂允许客户使用抽象的接口来创建一组相关的产品&a…