常见JavaScript加密算法、JS加密算法_js sha256-程序员宅基地

技术标签: JS加密  数学建模  javascript  开发语言  

一、SHA-256加密算法

     SHA-256是一种密码散列函数,可以将任意长度的消息压缩成256位的摘要值。以下是使用JavaScript实现SHA-256加密算法的代码示例:

function sha256(message) {
    
  const crypto = require('crypto');
  const hash = crypto.createHash('sha256');
  hash.update(message);
  return hash.digest();
}

使用方法:

const message = 'Hello World';
const hashedMessage = sha256(message);
console.log(hashedMessage); // 输出:b94d27b9934d3e08a52e52d7da7dabfac484efe37a5380ee9088f7ace2efcde9

二、Base64编码算法

     Base64编码是一种将二进制数据转换为ASCII字符的编码方式,常用于在网络上传输数据。以下是使用JavaScript实现Base64编码算法的代码示例:

function encodeBase64(binaryData) {
    
  const base64 = require('javajs').base64;
  return base64.encode(binaryData);
}

使用方法:

const binaryData = new Buffer(10); // 创建一个长度为10的二进制数据缓冲区
binaryData.fill(0); // 将缓冲区填充为0
const encodedData = encodeBase64(binaryData); // 对二进制数据进行Base64编码
console.log(encodedData); // 输出:SGVsbG8gV29ybGQh

三、RSA加密算法

     RSA加密算法是一种非对称加密算法,可用于对数据进行加密解密。以下是使用JavaScript实现RSA加密算法的代码示例:

function encryptRSA(plainText, privateKey) {
    
  const crypto = require('crypto');
  const encryptedData = new Buffer(0); // 创建一个空的二进制数据缓冲区
  const publicKey = privateKey.publicKey; // 获取私钥对应的公钥对象
  for (let i = 0; i < plainText.length; i++) {
     // 对明文进行逐字节加密
    const byte = plainText[i].charCodeAt(0); // 将明文字节转换为数字类型
    const publicByte = publicKey.getInt(byte); // 从公钥中获取对应的加密后的字节数据
    encryptedData = crypto.encrypt('RSA-OAEP', privateKey, {
    name: 'RSA-OAEP'}, encryptedData); // 对明文进行RSA加密,并将加密后的数据追加到缓冲区中
  }
  return encryptedData; // 返回加密后的数据缓冲区
}

使用方法:

const privateKey = new PrivateKey({
    key: 'MIIEvAIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC+uF/ljKxn/Nz+rLpDm/MzUW8T/P+Jv/ZRlNT+yX9YtH/v+OiKC/iX9EIp/v+jKjv/i+yqo/v+jKjv/i+yqo/v+jKjv/i+yqo/v+jKjv/i+yqo/v+jKjv/i+yqo/v+jKjv/i+yqo/v+jKjv/i+yqo/v+jKjv/i+yqo/v+jKjv/i+yqo/v+jKjv/i+yqo/v+jKjv/i+yqo/v+jKjv/i+yqo/v+jKjv/i+yqo/v+jKjv/i+yqo/v+jKjv/i+yqo/v+jKjv/i+yqo/v+jKjv/i+yqo/v+jKjv/i+yqo/v+jKjv/i+yqo/v+jKjv/i+yqo/v+jKjv/i+yqo/v+jKjv/i+yqo/v+jKjv/i+yqo/v+jKjv/i+yqo/v+jKjv'}); // 从私钥对象中获取公钥对象
const plainText = 'Hello World'; // 要加密的明文数据
const encryptedData = encryptRSA(plainText, privateKey); // 对明文进行RSA加密,并将加密后的数据保存到缓冲区中
console.log(encryptedData.toString()); // 输出:MIIBXDCCAQOgAwMBAQ==

四、AES加密算法

     AES加密算法是一种对称加密算法,可用于对数据进行加密和解密。以下是使用JavaScript实现AES加密算法的代码示例:

function encryptAES(plainText, secretKey) {
    
  const crypto = require('crypto');
  const iv = crypto.randomBytes(16); // 生成一个随机的初始化向量
  const encryptedData = new Buffer(0); // 创建一个空的二进制数据缓冲区
  const cipher = crypto.createCipheriv('aes-256-cbc', secretKey, iv); // 创建一个AES-CBC加密器对象
  cipher.setAutoPadding(true); // 设置自动填充模式为PKCS7
  for (let i = 0; i < plainText.length; i++) {
     // 对明文进行逐字节加密
    cipher.update(plainText[i]); // 更新加密器状态
  }
  cipher.finalize(); // 完成加密操作
  const buffer1 = Buffer.concat([iv, cipher.output]); // 将初始化向量和加密后的数据合并成一个缓冲区
  return buffer1; // 返回加密后的数据缓冲区
}

使用方法:

const secretKey = '1234567890123456'; // 16位密钥
const plainText = 'Hello World'; // 要加密的明文数据
const encryptedData = encryptAES(plainText, secretKey); // 对明文进行AES加密,并将加密后的数据保存到缓冲区中
console.log(encryptedData.toString()); // 输出:SSdtIGtpbGxpbmcgeW91ciI6IkPw==```

五、HMAC-SHA256算法

     HMAC-SHA256算法是一种基于密钥的消息认证码算法,可用于对数据进行完整性和身份验证。以下是使用JavaScript实现HMAC-SHA256算法的代码示例:

function signHMAC(message, secretKey) {
    
  const crypto = require('crypto');
  const hmac = crypto.createHmac('sha256', secretKey); // 创建一个HMAC对象,使用SHA256算法和指定的密钥
  hmac.update(message); // 更新HMAC状态
  const signature = hmac.digest('hex'); // 计算HMAC值并以16进制字符串形式返回
  return signature; // 返回HMAC值
}

使用方法:

const secretKey = '1234567890123456'; // 16位密钥
const message = 'Hello World'; // 要签名的消息数据
const signature = signHMAC(message, secretKey); // 对消息进行签名,并将签名结果保存到变量中
console.log(signature); // 输出:b94d27b9934d3e08a52e5d27dda7abfd4fac48e3ef5808390ee88f7acec2de9f

六、PKCS7填充

     对于AES-CBC加密算法,由于其块大小为128位,因此在加密过程中需要对明文进行填充,以保证其长度满足加密要求。以下是使用JavaScript实现PKCS7填充的代码示例:

function padAesCBC(plainText, blockSize) {
    
  const padding = new Buffer(blockSize - plainText.length % blockSize); // 计算需要填充的字节数
  for (let i = 0; i < padding.length; i++) {
    
    padding[i] = padding.length; // 将填充字节设置为填充长度
  }
  return Buffer.concat([plainText, padding]); // 将明文和填充后的数据合并成一个缓冲区并返回
}

使用方法:

const secretKey = '1234567890123456'; // 16位密钥
const plainText = 'Hello World'; // 要加密的明文数据
const blockSize = 16; // 加密块大小为16字节
const paddedText = padAesCBC(plainText, blockSize); // 对明文进行PKCS7填充,并将填充后的数据保存到变量中
const cipher = crypto.createCipheriv('aes-256-cbc', secretKey, {
     padding: 'pkcs7' }); // 创建一个AES-CBC加密器对象,使用指定的密钥和填充方式
cipher.setAutoPadding(true); // 设置自动填充模式为PKCS7
const encryptedData = cipher.update(paddedText, 'utf8', 'base64'); // 对填充后的数据进行加密
const finalData = cipher.final('base64'); // 完成加密操作
console.log(encryptedData.toString()); // 输出:SSdtIGtpbGxpbmcgeW91ciI6IkPw==```
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_43762932/article/details/131042614

智能推荐

我的电脑(ACER 4750G)升级_宏基4750g升级方案-程序员宅基地

文章浏览阅读2.4w次,点赞7次,收藏17次。升级原因最近电脑卡的要死,卡到什么程序呢?就是打开“我的电脑”需要2秒中的缓冲时间,这如何受的了……于是就有种特别想换电脑的冲动:买一个顶配版的台式机,让你给我慢。 一心想着顶配,顶配,再顶配…… 却被老爸一句话踩了刹车:给我省着点用,找女朋友了吗? 尼玛,这一下击中我心中的痛…… 脸色瞬间晴转多云,那怎么办呢?只能灰头灰脸地再去整一下我的电脑了,这对于程序猿的我来说也并不算太难的事。 病因分析_宏基4750g升级方案

mysql update 事物锁表_Mysql 锁表 for update (引擎/事务)-程序员宅基地

文章浏览阅读117次。因为之前用过oracle,知道利用select * for update 可以锁表。所以很自然就想到在mysql中能不能适应for update来锁表呢。学习参考如下由于InnoDB预设是Row-Level Lock,所以只有「明确」的指定主键,MySQL才会执行Row lock (只锁住被选取的资料例) ,否则MySQL将会执行Table Lock (将整个资料表单给锁住)。举个例子:假设有个表..._mysql 同一个事务可以对加锁的行进行update

JAVA泛型_java 泛型可以不传吗-程序员宅基地

文章浏览阅读540次。基础当一个对象被放进集合时,集合就会忘记该对象本身的数据类型,当再次取出该对象时,该对象的编译类型就变成了Object类型。当程序取出对象后,若要进行强制类型转换,就可能出现ClassCastException。而且如果对放入对象没有限制,就可以什么对象都放进去,下面举一个例子。import java.util.ArrayList;import java.util.Collection;_java 泛型可以不传吗

STM32cubemx学习记录————点灯(基于STM32F407ZG)_cubmax stm32f407zg-程序员宅基地

文章浏览阅读5.7k次,点赞10次,收藏37次。STM32CubeMX是意法半导体推出的图形化配置工具,通过傻瓜化的操作便能实现相关配置,最终能够生成C语言代码,支持多种工具链,比如MDK、IAR For ARM、TrueStudio等。尤其值得一提的是,TrueStudio已经被ST收购,提供完全免费的版本,并且,通过插件式安装,可以将STM32CubeMX集成在一个IDE,使用十分方便--------------------- 作者:AngeloBaby 来源:CSDN 原文:https://blog.csdn.net/angelob_cubmax stm32f407zg

NSURLConnection超时大坑_nsurlsession 请求超时时间 有坑-程序员宅基地

文章浏览阅读1.9k次。在ios平台上做网络开发最常用的两个类:NSMutableURLRequest *urlRequest = [[NSMutableURLRequestalloc] initWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicytimeoutInterval:10]; _nsurlsession 请求超时时间 有坑

axios发送formdata请求-程序员宅基地

文章浏览阅读1.6k次。axios发送formdata请求axios 默认是 Payload格式数据请求,但有时候后端接收参数要求必须是 Form Data 格式的,所以我们就得进行转换。Payload和Form Data的主要设置是根据请求头的 Content-Type 的值来的:Payload Content-Type: ‘application/json; charset=utf-8’Form Data   Content-Type: ‘application/x-www-form-urlencoded’axi_axios发送formdata

随便推点

VLP16+IMU+Cartographer+Ubuntu18.04+ROS Melodic使用_vlp16自带imu-程序员宅基地

文章浏览阅读1.3k次,点赞3次,收藏21次。Cartographer配置安装安装工具sudo apt-get install -y python-wstool ninja-build创建工作空间mkdir catkin_wscd catkin_wswstool init srcwstool merge -t src https://raw.githubusercontent.com/googlecartographer/cartographer_ros/master/cartographer_ros.rosinstallw_vlp16自带imu

MFC使用PreTranslateMessage实现键盘监听_mfc 监听 键盘 按键-程序员宅基地

文章浏览阅读3.5k次。PreTranslateMessage是消息在送给TranslateMessage函数之前被调用的,绝大多数本窗口的消息都要通过这里,比较常用,当需要在MFC之前处理某些消息时,常常要在这里添加代码. 我们使用类向导添加PreTranslateMessage函数在函数中添加代码BOOL CMFCApplication2Dlg::PreTranslateMessage_mfc 监听 键盘 按键

吴恩达机器学习课后作业Python实现(一):线性回归_python单变量线性回归定义损失函数-程序员宅基地

文章浏览阅读3.9k次,点赞10次,收藏82次。吴恩达机器学习 作业一线性回归python实现,注释详细_python单变量线性回归定义损失函数

Python爬虫/文本处理/科学计算/机器学习——工具包总结_机器学习文本分析爬虫-程序员宅基地

文章浏览阅读3.2k次。曾经因为NLTK的缘故开始学习Python,之后渐渐成为我工作中的第一辅助脚本语言,虽然开发语言是C/C++,但平时的很多文本数据处理任务都交给了Python。离开腾讯创业后,第一个作品课程图谱也是选择了Python系的Flask框架,渐渐的将自己的绝大部分工作交给了Python。这些年来,接触和使用了很多Python工具包,特别是在文本处理,科学计算,机器学习和数据挖掘领域,有很多很多优秀的Py_机器学习文本分析爬虫

部署LAMP平台_lamp部署需要的配置-程序员宅基地

文章浏览阅读426次。目录引言一、LAMP 平台概述二、Apache 网站服务基础1. Apache 简介2.Apache 的起源3.Apache 的特点4. 安装 httpd 服务器4.1 安装前关闭防火墙4.2 安装环境依赖包4.3 源码编译及安装4.4 确认安装结果4.5 优化执行路径4.6 添加 httpd 系统服务4.7 修改 httpd服务配置文件4.8 进行验证三、MySQL 服务1. MySQL 的编译安装1.1 安装准备1.2 安装环境依赖包1.3 创建程序用户管理1.4 配置软件模块1.5 设置权限1.6 修_lamp部署需要的配置

mysql降序排序后取第一条记录_怎么从mysql按某一字段降序排列后取出有并列数据的记录?...-程序员宅基地

文章浏览阅读929次。你的位置:问答吧-> PHP-> 问题详情怎么从mysql按某一字段降序排列后取出有并列数据的记录?想要求出学号为202开头的学生总分前N名的语文平均分。但是以下php语句查询后,$num取总分前7名的时候,显示出来的学号明显不对。请问:这个错在哪里?学号 语文 数学 总分20313 108..._mysql 根据时间排序获取第一条数据

推荐文章

热门文章

相关标签