文章是我整理出来的笔记略微粗糙,记录crypto库的简单了解和用法。

  1. crypto
  2. Hash(散列)算法
  3. Hmac算法
  4. PBKDF2函数
  5. 对称加密
  6. 小结
文中主要介绍node 的cypto模块,结合前端crypto-js演示(crypto-js是javascript 实现的cypto库)。

1. crypto

Crypto++ 库是一个用c++ 编写的密码类库,提供完整的加密实现,并且通常包括不太流行,不常使用的方案。(简单说:crypto 是一个包括了加解密算法的库)
node crypto 模块提供了加密功能,包括对 OpenSSL 的哈希、HMAC、加密、解密、签名、以及验证功能的一整套封装。

2.Hash(散列)算法

哈希算法将任意长度的输入通过散列算法变换成固定长度的输出,该输出就是hash值,常见的有md5,sha1,sha256等。
举个例子:服务端将文件计算出哈希值,当客户端下载文件也计算出哈希值,然后比对,文件是否下载完毕。假设此时的文件信息是hello world,当双方的文件信息一致时,算出的hash值也一致。
node:
const crypto = require('crypto')

//创建并返回一个 Hash 对象,该对象可用于生成哈希摘要(参数为给定的算法)。
// const hash = crypto.createHash('md5');
const hash = crypto.createHash('sha256')
// 可任意多次调用update():
// 指定要摘要的原始内容,可以在摘要被输出之前使用多次update方法来添加摘要内容
hash.update('Hello, world!')
hash.update('Hello, nodejs!') // 计算传入要被哈希(使用 hash.update() 方法)的所有数据的摘要。
// 如果提供了 encoding,则返回字符串,否则返回 Buffer。
console.log(hash.digest('hex').length)

crypto-js:

let crypto = require('crypto-js')
let hash = crypto.algo.SHA256.create()
hash.update('Hello, world!')
hash.update('Hello, nodejs!')
let result = hash.finalize()
// WordArray object
console.log(result.toString(crypto.enc.Hex));
node的Hash类:
crypto.createHash() 方法用于创建 Hash 实例
Hash 类是一个实用工具,用于创建数据的哈希摘要。 它可以通过以下两种方式之一使用:
  • 作为可读写的流,其中写入数据以在可读侧生成计算后的哈希摘要(继承自: </stream.Transform>)。
  • 使用 hash.update() 和 hash.digest() 方法生成计算后的哈希。

3. Hmac算法

HMAC算法将散列(hash)算法与一个密钥结合在一起,以阻止对签名完整性的破坏,密钥发生了变化,输出结果也会发生变化.(Hmac可以理解为用随机数“增强”的哈希算法)
还是上面的例子换个算法
node:
let crypto = require('crypto')
// 密钥
let key = '密钥'
// 选定的摘要算法 sha256 选的密钥 key
let hmac = crypto.createHmac('sha256',key)
hmac.update('Hello, world!');
hmac.update('Hello, nodejs!');
let result = hmac.digest('hex');
console.log(result)
crypto-js:
let CryptoJS = require('crypto-js')
// 密钥
let key = '密钥'
// 密钥 keyBit 摘要算法 sha256
let hmac = CryptoJS.algo.HMAC.create(CryptoJS.algo.SHA256, key);
hmac.update('Hello, world!')
hmac.update('Hello, nodejs!')
let result = hmac.finalize()
// WordArray object
console.log(result.toString(CryptoJS.enc.Hex));
node crypto Hmac 类:
crypto.createHmac() 方法用于创建 Hmac 实例
Hmac 类是一个实用工具,用于创建加密的 HMAC 摘要。 它可以通过以下两种方式之一使用:
  • 作为可读写的流,其中写入数据以在可读侧生成计算后的 HMAC 摘要(继承自: </stream.Transform>)。
  • 使用 hmac.update() 和 hmac.digest() 方法生成计算后的 HMAC 摘要。

4.PBKDF2函数

PBKDF2:是一个用来导出密钥的函数,常用于生成加密的密码
基本原理:通过一个伪随机函数(例如HMAC函数),把明文和一个盐值作为输入参数,然后重复进行运算,并最终产生密钥。
node:
let crypto = require('crypto')

let password = 'luoxiaobuhaha' // 用来生成密钥的原文密码
let salt = 'salt' // 一个加密用的盐值。
let iterations = 10000 // 迭代次数
let keylen = 16 // 期望得到秘钥的长度
// 由选择HMAC摘要算法,digest 以导出所请求的字节长度
let digest = 'sha256' // 一个伪随机函数
crypto.pbkdf2(password, salt, iterations, keylen, digest, (err, derivedKey) => {
if (err) throw err
console.log(derivedKey.toString('hex'))
})
 
crypto-js:
let CryptoJS = require('crypto-js')
var derivedKey = CryptoJS.PBKDF2(password, salt, {
keySize: 4, // // WordArray object
iterations: iterations,
hasher: CryptoJS.algo.SHA256
}); console.log(derivedKey.toString(CryptoJS.enc.Hex))
crypto.pbkdf2提供异步的基于密码的密钥派生功能2(PBKDF2)实现。由指定的选择HMAC摘要算法digest被施加以导出所请求的字节长度。也有同步方法,更多细节参考文档。

5.对称加密

对称加密算法,加解密都用同一个密钥。
node:
let crypto = require('crypto')
// data:需要加解密的内容,
// key: 密钥
// 初始化向量(iv)
function aesEncrypt(data, key, iv) {
// 给定的算法,密钥和初始化向量(iv)创建并返回Cipher对象
const cipher = crypto.createCipheriv('aes-192-cbc', key, iv)
// Key length is dependent on the algorithm. In this case for aes192, it is 24 bytes (192 bits).
// 指定要摘要的原始内容,可以在摘要被输出之前使用多次update方法来添加摘要内容
// 数据的编码 utf8 返回值的编码 hex
var crypted = cipher.update(data, 'utf8', 'hex')
crypted += cipher.final('hex')
return crypted
} function aesDecrypt(data, key, iv) {
// 给定的算法,密钥和初始化向量(iv)创建并返回Cipher对象
const decipher = crypto.createDecipheriv('aes-192-cbc', key, iv)
// 数据的编码 hex 返回值的编码 utf8
var decrypted = decipher.update(data, 'hex', 'utf8')
decrypted += decipher.final('utf8')
return decrypted
}
const IV = 'f710b45f04e37709' // 初始化向量(iv)
let data = 'luoxiaobu' // 需要加解密的内容,
let key = '123456789987654321123456' // 24 位秘钥密钥 let encryptData = aesEncrypt(data, key, IV)
let decryptData = aesDecrypt(encryptData, key, IV) console.log(encryptData)
console.log(decryptData)
输出:
b98a1d87ea00fb47ade2d9cff0a9179d
luoxiaobu
crypto-js:
const CryptoJS = require('crypto-js')
const IV = CryptoJS.enc.Utf8.parse('f710b45f04e37709') // 十六位十六进制数作为密钥偏移量
let data = 'luoxiaobu' // 需要加解密的内容,
let key = CryptoJS.enc.Utf8.parse('123456789987654321123456') // 24 位秘钥密钥 function decrypt(data, key, iv) {
let dataHexStr = CryptoJS.enc.Hex.parse(data);
let dataBase64 = CryptoJS.enc.Base64.stringify(dataHexStr);
// 接收的数据是 base64
let decrypt = CryptoJS.AES.decrypt(dataBase64, key, { iv: iv, mode: CryptoJS.mode.CBC});
let decryptedStr = decrypt.toString(CryptoJS.enc.Utf8);
return decryptedStr.toString();
} //加密方法
function encrypt(data, key, iv) {
let encrypted = CryptoJS.AES.encrypt(data, key, { iv: iv, mode: CryptoJS.mode.CBC});
return encrypted.ciphertext.toString().toUpperCase();;
} let encryptData = encrypt(data, key, IV)
let decryptData = decrypt(encryptData, key, IV) console.log(encryptData)
console.log(decryptData)
输出:
b98a1d87ea00fb47ade2d9cff0a9179d
luoxiaobu
补充:
AES是一种常用的对称加密算法。加密的分组模式有ECB/CBC/CFB/OFB
分组密码又称为秘密钥密码或对称密码。利用分组密码对明文进行加密时,首先需要对明文进行分组,每组的长度都相同,然后对每组明文分别加密得到等长的密文,分组密码的特点是加密密钥与解密密钥相同。 分组密码的安全性应该主要依赖于密钥,而不依赖于对加密算法和解密算法的保密。因此,分组密码的加密和解密算法可以公开。
node cropty Cipher 类 ,node cropty Decipher类 具体使用参考文档

6.小结

文章是我整理出来的笔记略微粗糙,记录crypto库的简单了解和用法,理解不准确之处,欢迎一起讨论学习。
关于crypto库还常用的有非对称加密算法,以及签名,之后也会修正补上。
 
资料:
 

crypto 简单了解的更多相关文章

  1. nodejs加密Crypto简单例子

    加密技术通常分为两大类:“对称式”和“非对称式”. 对称式加密: 就是加密和解密使用同一个密钥,通常称之为“Session Key ”这种加密技术在当今被广泛采用,如美国政府所采用的DES加密标准就是 ...

  2. salesforce 零基础学习(四十七) 数据加密简单介绍

    对于一个项目来说,除了稳定性以及健壮性以外,还需要有较好的安全性,此篇博客简单描述salesforce中关于安全性的一点小知识,特别感谢公司中的nate大神和鹏哥让我学到了新得知识. 项目简单背景: ...

  3. 使用crypto模块实现md5加密功能(解决中文加密前后端不一致的问题)

    正常情况下使用md5加密 var crypto = require('crypto'); var md5Sign = function (data) { var md5 = crypto.create ...

  4. Linux内核分析第三周学习总结:构造一个简单的Linux系统MenuOS

    韩玉琪 + 原创作品转载请注明出处 + <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一.Linux内 ...

  5. linux c libcurl的简单使用(转)

    curl是Linux下一个非常著名的下载库,通过这个库,可以很简单的实现文件的下载等操作.看一个简单的例子: #include <curl/curl.h> #include <std ...

  6. openstack(liberty):部署实验平台(二,简单版本软件安装 part2)

    继续前面的part1,将后续的compute以及network部分的安装过程记录完毕! 首先说说compute部分nova的安装. n1.准备工作.创建数据库,配置权限!(密码依旧是openstack ...

  7. NodeJs 中的Crypto 加密模块

    加密技术通常分为两大类:“对称式”和“非对称式”. 对称式加密: 就是加密和解密使用同一个密钥,通常称之为“Session Key ”这种加密技术在当今被广泛采用,如美国政府所采用的DES加密标准就是 ...

  8. 设计一个简单的,低耗的能够区分红酒和白酒的感知器(sensor)

    学习using weka in your javacode 主要学习两个部分的代码:1.过滤数据集 2 使用J48决策树进行分类.下面的例子没有对数据集进行分割,完全使用训练集作为测试集,所以不符合数 ...

  9. Linux 内核开发—内核简单介绍

    内核简单介绍 Linux 构成 Linux 为什么被划分为系统空间和内核空间 隔离核心程序和应用程序,实现对核心程序和数据的保护. 什么内核空间,用户空间 内核空间和用户空间是程序执行的两种不同的状态 ...

随机推荐

  1. tensorflow会话控制-【老鱼学tensorflow】

    在tensorflow中,当定义好结构后,就要通过tf.session()来建立运行时的会话. 本例子应该不难理解,我们用tensorflow来计算一下一个1行2列的矩阵和2行1列矩阵的乘积: imp ...

  2. 平衡树简单教程及模板(splay, 替罪羊树, 非旋treap)

    原文链接https://www.cnblogs.com/zhouzhendong/p/Balanced-Binary-Tree.html 注意是简单教程,不是入门教程. splay 1. 旋转: 假设 ...

  3. eclipse下启动tomcat访问网址报404错误

    问题: 解决步骤 首先检查一遍自己tomcat的相关配置,如果无误,则继续下面的操作 1.打开server视图,双击tomcat进入编辑页面 选择其中的第二个选项,并且修改Server path中的内 ...

  4. java实现哈夫曼编码

    java实现哈夫曼编码 哈夫曼树   既然是学习哈夫曼编码,我们首先需要知道什么是哈夫曼树:给定n个权值作为n个叶子结点,构造一棵二叉树,若带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫 ...

  5. CSS(八)

    CSS3 transform变换 1.translate(x,y) 设置盒子位移2.scale(x,y) 设置盒子缩放3.rotate(deg) 设置盒子旋转4.skew(x-angle,y-angl ...

  6. windows下安装 mysql 8.0 以上版本以及遇到的问题

    Windows 上安装 MySQL Windows 上安装 MySQL 相对来说会较为简单,地那就链接 https://cdn.mysql.com//Downloads/MySQL-8.0/mysql ...

  7. ab 站点压力测试工具

    ab--压力测试工具 前端时间由于需要测试一个网站的高并发的情况,使用到了一个ab测试工具,下面是我自己的体验及参考网上别人的博客所写,希望对大家有所帮助. ab工具简介 ab 全称:apache b ...

  8. 最近发现一个php trim的bug

    用trim 排除字符串两边的 “.”:你会发现“耀.”会出现编码错误问题,导致程序出现错误!代码如下: $a = "王者荣耀."; echo trim($a,".&quo ...

  9. java.lang.NoClassDefFoundError: com/sun/image/codec/jpeg/JPEGCodec

    java.lang.NoClassDefFoundError: com/sun/image/codec/jpeg/JPEGCodec 这个类在 rt.jar 里面 本地开发,jre里有这个包,所以不会 ...

  10. 随笔二-https://www.cnblogs.com/shang1680/p/9657994.html

    作业要求来自https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/2097 GitHub远程仓库的地址:https://github.com/ ...