手机版

详细说明nodejs中各种加密算法的实现

时间:2021-08-21 来源:互联网 编辑:宝哥软件园 浏览:

前言

在大前端的趋势下,前端er也要懂得一些数据加密的知识。我们不需要深究加密算法的实现和原理。毕竟加密是一门高级学科,但我们还是需要掌握基本的加密方法和编码。毕竟我们没吃过猪肉,但是我们见过猪跑。

我总结了几种常见的加密和签名算法,并附上nodejs的编码实现。

编码算法

为了保证数据的安全性和防篡改性,很多数据在传输过程中都是加密的。比如最近很多网站都升级到了https协议,使用了非对称加密和哈希签名,还有github使用的ssh,也是非对称加密。还有登录时大多数密码使用的MD5加密等。

加密可以分为三类,对称加密和非对称加密,以及抽象算法,我们一一展开。

对称加密

引用百科描述:

利用单密钥密码体制的加密方法,同一密钥可以同时用于信息的加密和解密。这种加密方法称为对称加密,也称为单密钥加密。

对称加密很容易理解,就像如果我把我家的钥匙给你,如果你想来我家,就用这把钥匙直接开门。

目前,AES和DES是对称加密的主流。AES是新一代标准,速度快,安全级别更高。

俄歇电子能谱

AES有五种加密模式:CBC、ECB、CTR、OCF和CFB

ECB:电子秘籍模式,只需要一把钥匙,特点是简单,有利于并行计算。CBC:密文分组链接方式不仅需要密钥,还需要向量,向量的功能也是用于数据加密的,所以这种方式的安全性比ECB CTR、OCF、CFB好:具体算法的实现方式不同,优缺点也不同,这些算法都和CBC一样需要密钥和向量。AES有三种长度:128位、192位和256位。这三种长度的区别主要来自于密钥的长度:16字节密钥=128位,24字节密钥=192位,32字节密钥=256位。下表:

长度密钥长度向量长度128位16 16 192位24 16 256位32 16 DES

加密默认和AES一样,也有五种模式,除了ECB只需要密钥,其他模式都需要密钥和向量。

与AES不同,DES的密钥长度只有8字节,向量也是8字节。

编码实现

nodejs中的实现

/** * @description *对称加密* @param {*}数据加密data * @param {*}算法加密算法* @ param { * } key * @ param { * } iv vector * @返回*/function cipherivEncrypt(数据,算法,密钥,iv){ const cipheriv=crypto . createcipheriv(算法,密钥,iv)let encrypted=cipheriv . update(数据,' utf8 ',' hex ');encrypted=cipheriv . final(' hex ');返回加密的}/* * * @ description *对称解密* @param {*}数据解密* @param {*}算法解密算法* @ param { * } key * @ param { * } iv vector * @返回*/function ciphervdecrypt(数据,算法,密钥,iv){ const decrypt=crypto . createdecpheriv(算法,密钥,iv);let decrypted=decipher.update(数据,‘hex’,‘utf8’);decrypted=decrypt . final(' utf8 ');Return decrypted}使用政府提供的加密库实现加解密。加密后,上述代码输出一个十六进制字符串,可以根据具体情况更改为其他格式的数据。

调用如下

//AES对称加解密const str=' xiaoliyeconst key=' aaaaaaaaaaaaaaaaaaaaaaaaaa ';//24c onst iv=' aaaaaaaaaaaaaaaaaaaaaa ';//24c onst cipher essext=Cipherivencrypt(str,' aes-192-cfb ',key,Iv)const result text=Cipherivedecrypt(Cipher essext,' aes-192-cfb ',key,Iv)console . log(result text===str)//true//des对称加密和解密const str=' xiaoliyeconst key=' aaaaaaaa//8 const iv=' aaaaaaaa ';//8 const密文=cipherivencrypt (str,' des-CFB ',key,iv)const result text=cipherivecrypt(ciphereestext,' des-CFB ',key,iv)console . log(result text==str)/true非对称加密

非对称加密有两个密钥,公钥和私钥,如下图所示:

公钥可以对外公开,而私钥是自有的,不能公开。因为有两个密钥,这就是非对称加密这个名字的由来。

发送方用接收方公开的公钥对数据进行加密,接收方接收后用私钥对数据进行解密,服务处理后用私钥对要返回的数据进行加密,用公钥对数据进行解密。

这个过程就是非对称加解密,简单理解就是用公钥加密,用私钥解密的数据;用私钥加密的数据用公钥解密。

与对称加密相比,非对称加密要安全得多。对于对称加密,如果密钥被一方意外泄露,秘密文件可能会被破解和篡改。然而,非对称加密允许公钥自由流通,只要颁发密钥的一方保管好私钥,安全性就是适当的。

编码实现

让我们看看node中的编码实现,或者使用官方提供的加密库

加解密功能接收到的数据是Buffer类型的(对于Buffer的介绍,不知道的朋友可以阅读这个二进制和Buffer),所以需要约定接收和输出的数据类型。参数填充是一种填充方法。有几种填充方法,如加密。constants.rsa _ no _ padding,crypto。constants.rsa _ pkcs1 _ padding,crypto。constants . RSA _ pkcs1 _ oaep _ padding。因为没有深入研究,就不展开了。然而,有一点是加密和解密的填充方法必须一致。const constants=require(' constants ')const crypto=require(' crypto ')/* * * @ description *用公钥加密的数据* @param {*}要加密的数据* @param {*} public key * @ param { * } inputEncoding加密的数据类型* @param {*} outputEncoding输出数据类型* @ param { * }填充填充填充方法* @返回*/function public encrypt(数据、公钥、input encoding、outputEncoding、padding){ const encrypt text=crypto public。RSA_PKCS1_PADDING },Buffer.from(数据,inputEncoding));返回EncryptText . ToString(OutPutenCoding);}/** * @description *公钥解密数据* @param {*}要解密的数据* @param {*} publicKey公钥* @param {*} inputEncoding解密数据类型* @param {*} outputEncoding输出数据类型* @param {*}填充填充填充方法* @返回*/function public decrypt(数据、公钥、输入编码、输出编码、填充){ let decrypt text=const decryptext=crypto . public decrypt({ key : public key,padding: padding | |常量。RSA_PKCS1_PADDING },Buffer.from(数据,inputEncoding));返回DecryptText . ToString(OutPutenCoding);}/** * @description *私钥加密数据* @param {*}要加密的数据* @param {*} privateKey私钥* @param {*} inputEncoding加密数据类型* @param {*} OutputEncoding输出数据类型* @param {*}填充填充填充方法* @返回*/function private encrypt(数据、私钥、输入编码、输出编码、填充){ const encrypt text=crypto . private encrypt({ key : private key,padding:填充)RSA_PKCS1_PADDING },Buffer.from(数据,inputEncoding));返回EncryptText . ToString(OutPutenCoding);}/** * @description *私钥解密数据* @param {*}要解密的数据* @param {*} privateKey私钥* @param {*} inputEncoding解密数据类型* @param {*} OutputEncoding输出数据类型* @param {*}填充填充填充模式* @返回*/function privatedecode(数据、私钥、输入编码、输出编码、填充){ const decrypt text=crypto . private decrypt({ key : private key,padd 3366)RSA_PKCS1_PADDING },Buffer.from(数据,inputEncoding));返回DecryptText . ToString(OutPutenCoding);}有四个功能,即公钥的加解密和私钥的加解密。让我们看看如何使用它们。在示例中,它是我自己生成的密钥对,您可以自己替换它

const rsapublic key=`-begin公钥-MIG fm0 gcsqgsib 3 dqebaqquea 4 gndcbiqbkbqcndmxetosxtqcmwy 2 ywl 5 cqtb 81 px yzch 4 v5m 8 mnuzppcmf vdxqbuwqqqqv/ty 7 rlvi/bakfbx 9 niff CAPF 5 lpsiwsgwqwqwq 0s/rcwb 6y veokl 25 janrbvnwmsozojcces 5 q 829 LD 66云娥const decrypt text=private decrypt(cihertext、rsaprivatekey、“hex”、“utf8 ”)//孙悟空控制台。log(str===decryptext)/(true const ciherextrivate=private encrypt(str、rsaprivatekey、' utf8 '、' hex') //阿巧const decryptextpublics=public decrypt(ciherextrivate、rsapublickey、' hex '、' utf8') //云娥控制台。日志(str======decryptextpublic)/(true)是郑国荣吗

朱庇特朱庇特阿齐兹阿齐兹阿齐兹阿齐兹阿齐兹阿齐兹阿齐兹阿齐兹阿齐兹阿齐兹阿齐兹阿齐兹阿齐兹阿齐兹阿齐兹阿齐兹阿齐兹阿齐兹阿齐兹阿齐兹阿齐兹阿齐兹阿齐兹阿齐兹阿齐兹阿齐兹,云娥你好范思哲,范思哲,范思哲,拜占庭OpenSSL(OpenSSL)安其林安其林安其林。

安永(音译)(散列)

阿力克斯阿力克斯阿力克斯阿力克斯阿力克斯,你是说你是一个很好的人?你是一个很好的人,你是一个很好的人,你是一个很好的人,你是一个很好的人,你是一个很好的人,你是一个很好的人,你是一个很好的人,你是一个很好的人,你是一个很好的人,贺盛瑞?贺盛瑞,是贺盛瑞贺盛瑞贺盛瑞

元云,阿云阿云阿云阿云阿云阿云阿云阿云阿云阿云阿云阿云阿云阿云阿云阿云阿云阿云阿云阿云阿云阿云阿云阿云阿云阿云阿云阿云,鲁仲尼鲁仲尼。贾科琳贾科琳贾科琳,菲兰达。-你好-你好,云娥与云娥1,你是谁;喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂喂,我的天啊,你好,你是说.贺盛瑞(音)先生(音)先生(音)先生(音)先生(音)先生(音)先生(音)先生(音)先生(音)先生(音)先生(音)先生(音)先生(音)先生(音)先生(音)先生(音)先生),范仲淹,范仲淹,范仲淹,范仲淹,范仲淹,范仲淹,范仲淹,范仲淹,范仲淹,范仲淹,范仲淹,范仲淹,范仲淹,范仲淹,范仲淹,范仲淹,范仲淹,范仲淹,范仲淹,范仲淹,朱庇特朱庇特朱庇特。

贺盛文贺盛文,阿云娥阿云娜阿云娜阿云娜阿云娜阿云娜阿云娜阿云娜阿云娜阿云娜阿云娜阿云娜阿云娜阿云娜阿云娜阿云娜阿云娜阿云娜阿云娜阿云娜阿云娜阿云娜阿云娜,-你好-你好,阿叔阿叔阿叔阿叔阿叔阿叔阿叔阿叔阿叔阿叔阿叔阿叔阿叔阿叔阿叔阿叔阿叔阿叔阿叔阿叔阿叔阿叔阿叔阿叔阿叔阿叔阿叔阿叔阿叔阿叔阿叔阿叔阿叔阿叔,你是说.(哎哎盐类,唉哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟哟杂凑(哈希)-什么。

阿贺盛德阿贺盛德阿贺盛德MD5(MD5)你好沙-2,MD5阿金阿金阿金阿金阿金阿金阿金阿金阿金阿金阿金阿金阿金阿金阿金阿金阿金阿金阿金阿金阿金阿金阿金32 大和sha256阿金阿金阿金阿金阿金阿金阿金阿金阿金阿金阿金阿金阿金阿金阿金阿金阿金阿金阿金阿金阿金阿金阿金64 大和。

云娥一

云娥与云娥同在加密的对

/* * *描述* MD5 * @ param { * }数据* @返回*/函数MD5(数据){ const hash=crypto。创建哈希(' MD5 ');返回hash.update(数据)。摘要(' hex ');}/* * * description * sha 256 * @ param { * } data * @ returns */function sha 256(data){ const hash=crypto。创建哈希(' sha 256 ');返回hash.update(数据)。摘要(' hex ');}控制台。日志(MD5(' asdf ')912 EC 803 B2 ce 49 e4a 541068d 495 ab 570控制台。log(sha 256(' asdf ')F0和4c 76 c 58691 EC 258 f 246815 bea 091d 4247 a 2 fc 3 e 18694461 b 1816 e 13b是吗

云娥?云娥?云娥?云娥,范仲淹与范仲淹,范仲淹,范仲淹~

范仲淹,范仲淹,范仲淹,范仲淹,范仲淹,范仲淹,范仲淹,范仲淹,范仲淹,范仲淹,范仲淹,范仲淹,范仲淹,范仲淹,范仲淹,范仲淹,范仲淹,范仲淹,范仲淹,范仲淹,杨俊钦先生~

你好,朱庇特朱庇特朱庇特朱庇特,-你好-你好-你好,云娥与云娥。

版权声明:详细说明nodejs中各种加密算法的实现是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。