JavaScript Crypto-JS 前言与工具

→ 前言
使用 Crypto-JS 可以非常方便地在 JavaScript 进行 MD5、SHA1、SHA2、SHA3、RIPEMD-160 哈希散列,进行 AES、DES、Rabbit、RC4、Triple DES 加解密

→ 下载引用
可以在这个GitHub的 https://github.com/brix/crypto-js 上下载该js,它可以单独引入所需要加密方式的js;也可以引入一个crypto-js.js 这个文件,它相当于引入了所有的加密方式

→ Crypto-js在线工具
基于 Crypto-JS 实现的在线加密解密工具 —— 在线哈希、在线散列在线加密、在线解密

使用 Crypto-JS 进行哈希、散列

① md5

﹟简介:
MD5算法是广泛使用的杂凑函数,也就是哈希函数,英文全拼是:Message Digest Algorithm,其特点如下:

  • 一个任意长度的数据,经过MD5计算后就会得到一个长度固定的十六进制字符串;
  • MD5算法消耗较低,不会在性能在造成压力;
  • 抗修改性很强,相差极小的两个原数据的MD5值差异会很大
  • 抗碰撞性也很强,伪造数据的难度很大

这里解释一下抗碰撞性。抗碰撞性是相对与碰撞攻击讲,碰撞攻击指两个不同的原数据在算法加密后得到了相同的值。MD5具有很强的抗碰撞性(此处看了不少资料,好像王小云教授的算法已经能够破解MD5的防碰撞性)。

﹟两种引入 md5.js方式(之后的就直接一起写)

import CryptoJS from 'crypto-js/md5'

<script src="cryptojs/rollups/md5.js"></script>

﹟调用 md5 方法

var str = '123456';
CryptoJS.MD5(str);

② pbkdf2

﹟简介:
pbkdf2是一个基于密码的密钥派生函数。在许多密码学应用中,用户安全最终依赖于密码,由于密码通常不能直接用作密钥,因此需要进行一些处理。

salt库为任何给定的密码提供了大量的密钥集,而迭代计数增加了从密码生成密钥的成本,从而增加了攻击的难度。

﹟引入 pbkdf2.js

import CryptoJS from 'crypto-js/pdkdf2'

<script src="cryptojs/rollups/pbkdf2.js"></script>

﹟调用 pbkdf2 方法

// 官方示例
var str = '123456';
var salt = CryptoJS.lib.WordArray.random(128/8);
 
var key128Bits = CryptoJS.PBKDF2(str, salt, { keySize: 128/32 });
var key256Bits = CryptoJS.PBKDF2(str, salt, { keySize: 256/32 });
var key512Bits = CryptoJS.PBKDF2(str, salt, { keySize: 512/32 });
 
var key512Bits1000Iterations = CryptoJS.PBKDF2("Secret Passphrase", salt, {
keySize: 512/32,
iterations: 1000
});

③ ripemd160

﹟简介:
RIPEMD-160 是 160 位加密哈希函数。 它旨在用于替换 MD4 和 MD5,RIPEMD 的 128 位哈希函数。RIPEMD建立在md的基础之上,所以,其添加数据的方式和md5完全一样

﹟引入 ripemd160.js

import CryptoJS from "crypto-js/ripemd160";

<script src="cryptojs/rollups/ripemd160.js"></script>

﹟调用 ripemd160 方法

var str = '123456';
CryptoJS.RIPEMD160(str);

④ sha 系列:sha1、sha256、sha384、sha514…

﹟简介:
Salt ProvidersSha哈希函数由国家安全局(NSA)设计。sha-1是现有的sha散列函数中最成熟的,它被用于各种安全应用程序和协议中。尽管如此,随着新的攻击被发现或改进,sha-1的抗碰撞能力一直在减弱。

sha-256是sha-2中的四种变体之一。虽然看起来它提供了更好的安全性,但它并没有sha-1广泛使用。

sha-512在很大程度上与sha-256相同,但操作时使用的是64位字,而不是32位字。

CryptoJS还支持sha-224和sha-384,它们基本相同,但分别是sha-256和sha-512的截断版本。

SHA-3是一项为期五年的选择新密码散列算法竞赛的获胜者,该算法对64个竞争设计进行了评估。

可以将sha-3配置为输出224、256、384或512位之一的哈希长度。默认值为512位

﹟引入 sha 相关 js

import CryptoJS from "crypto-js/sha1";
...
import CryptoJS from "crypto-js/sha256";
import CryptoJS from "crypto-js/sha384";
import CryptoJS from "crypto-js/sha514";

<script src="cryptojs/rollups/sha1.js"></script>
...
<script src="cryptojs/rollups/sha256.js"></script>
<script src="cryptojs/rollups/sha384.js"></script>
<script src="cryptojs/rollups/sha512.js"></script>

﹟调用 sha 相关方法

var str = '123456';
CryptoJS.SHA1(str);
 
var str = '123456';
CryptoJS.SHA3(str);
 
// 配置输出的哈希长度
CryptoJS.SHA3(str, {outputLength : 224});
CryptoJS.SHA3(str, {outputLength : 256});
CryptoJS.SHA3(str, {outputLength : 384});
CryptoJS.SHA3(str, {outputLength : 512});
 
var str = '123456';
CryptoJS.SHA224(str);
 
var str = '123456';
CryptoJS.SHA256(str);
 
var str = '123456';
CryptoJS.SHA284(str);
 
var str = '123456';
CryptoJS.SHA512(str);

⑤ hmac 系列:hmac_md5、hmac_ripemd160、hmac_sha1、hmac_sha3…

﹟简介:
基于哈希的消息身份验证代码 (HMAC) 可以用于确定是否通过不安全通道发送的消息已被篡改,前提是在发送方和接收方共享机密密钥。 发件人计算原始数据的哈希值,并将原始数据和 HMAC 传送一条消息。 接收方重新计算对收到的消息哈希值,并检查计算哈希值与传输的哈希值相匹配。

HMAC 可以用于任何迭代的加密哈希函数,例如 MD5 或 SHA-1,与共享密钥结合使用。 HMAC 的加密强度取决于基础的哈希函数的属性。

对数据或哈希值进行任何更改会导致不匹配,因为更改消息和重新生成的正确哈希值需要机密密钥。 因此,如果原始和计算所得的哈希值匹配,该消息进行身份验证。

﹟引入 hmac 相关 js

import CryptoJS from "crypto-js/hmac-md5";
import CryptoJS from "crypto-js/hmac_ripemd160";
import CryptoJS from "crypto-js/hmac-sha1";
import CryptoJS from "crypto-js//hmac-sha3";

<script src="cryptojs/rollups/hmac-md5.js"></script>
<script src="cryptojs/rollups/hmac_ripemd160.js"></script>
<script src="cryptojs/rollups/hmac-sha1.js"></script>
<script src="cryptojs/rollups/hmac-sha3.js"></script>

﹟调用 hmac 相关 方法

var str = '123456';
var password = 'password';
 
// Hmac 相关调用前都增加了 Hmac
CryptoJS.HmacMD5(str, password);
CryptoJS.HmacRIPEMD160(str, password);
CryptoJS.HmacSHA1(str, password);
CryptoJS.HmacSHA3(str, password);
CryptoJS.HmacSHA224(str, password);
CryptoJS.HmacSHA256(str, password);
CryptoJS.HmacSHA384(str, password);
CryptoJS.HmacSHA512(str, password);
使用 Crypto-JS 进行加密、解密

→ 这里特别注意的是:Crypto-JS 相关 encrypt 函数会并不直接返回字符串,需要调用返回对象的 toString 方法,或者通过 Crypto-JS 转码才能得到真实的结果

① AES

﹟简介:
高级加密标准(AES,Advanced Encryption Standard)为最常见的对称加密算法(微信小程序加密传输就是用这个加密算法的)。对称加密算法也就是加密和解密用相同的密钥,具体的加密流程如下图:
在这里插入图片描述
具体介绍可以看一下这篇文章: https://blog.csdn.net/qq_28205153/article/details/55798628

﹟引入 aes.js

import CryptoJS from "crypto-js/aes";

<script src="cryptojs/rollups/aes.js"></script>

﹟调用 CryptoJS.AES

// 官方示例, 每次输出的密文都不一样
CryptoJS.AES.encrypt("Message", "Secret Passphrase");
 
// 正确用法
 
var str = '123456';
// 密钥 16 位
var key = '0123456789abcdef';
// 初始向量 initial vector 16 位
var iv = '0123456789abcdef';
// key 和 iv 可以一致
 
key = CryptoJS.enc.Utf8.parse(key);
iv = CryptoJS.enc.Utf8.parse(iv);
 
var encrypted = CryptoJS.AES.encrypt(str, key, {
    iv: iv,
    mode: CryptoJS.mode.CBC,
    padding: CryptoJS.pad.Pkcs7
});
 
// 转换为字符串
encrypted = encrypted.toString();
 
// mode 支持 CBC、CFB、CTR、ECB、OFB, 默认 CBC
// padding 支持 Pkcs7、AnsiX923、Iso10126
// 、NoPadding、ZeroPadding, 默认 Pkcs7, 即 Pkcs5
 
var decrypted = CryptoJS.AES.decrypt(encrypted, key, {
    iv: iv,
    mode: CryptoJS.mode.CBC,
    padding: CryptoJS.pad.Pkcs7
});
 
// 转换为 utf8 字符串
decrypted = CryptoJS.enc.Utf8.stringify(decrypted);
 
// 引入其他加密模式, 填充模式需要引入对应的 js 文件
/*
cryptojs/components/mode-cfb-min.js
cryptojs/components/mode-ctr-min.js
cryptojs/components/mode-ecb-min.js
cryptojs/components/mode-ofb-min.js
cryptojs/components/pad-ansix923-min.js
cryptojs/components/pad-iso10126-min.js
cryptojs/components/pad-iso97971-min.js
cryptojs/components/pad-nopadding-min.js
*/

② DES、Triple DES

﹟简介:
DES、Triple DES 的调用形式与 AES 一致

﹟引入 triple.js, DES 和 Triple DES 都定义在 tripledes.js

import CryptoJS from "crypto-js/tripledes";

<script src="cryptojs/rollups/tripledes.js"></script>

﹟调用 CryptoJS.DES, CryptoJS.TripleDES

var str = '123456';
var key = '0123456789abcdef';
var iv = '0123456789abcdef';
 
key = CryptoJS.enc.Utf8.parse(key);
iv = CryptoJS.enc.Utf8.parse(iv);
 
// DES 加密
var encrypted = CryptoJS.DES.encrypt(str, key, {
    iv: iv,
    mode: CryptoJS.mode.CBC,
    padding: CryptoJS.pad.Pkcs7
});
 
// 转换为字符串
encrypted = encrypted.toString();
 
// DES 解密
var decrypted = CryptoJS.DES.decrypt(encrypted, key, {
    iv: iv,
    mode: CryptoJS.mode.CBC,
    padding: CryptoJS.pad.Pkcs7
});
 
// 转换为 utf8 字符串
decrypted = CryptoJS.enc.Utf8.stringify(decrypted);
 
// Triple DES 加密
var encrypted = CryptoJS.TripleDES.encrypt(str, key, {
    iv: iv,
    mode: CryptoJS.mode.CBC,
    padding: CryptoJS.pad.Pkcs7
});
 
// 转换为字符串
encrypted = encrypted.toString();
 
// Triple DES 解密
var decrypted = CryptoJS.TripleDES.decrypt(encrypted, key, {
    iv: iv,
    mode: CryptoJS.mode.CBC,
    padding: CryptoJS.pad.Pkcs7
});
 
// 转换为 utf8 字符串
decrypted = CryptoJS.enc.Utf8.stringify(decrypted);

③ Rabbit、RC4

﹟简介:
Rabbit、RC4 调用方式一致,不支持 mode、padding。

﹟引入 rabbit.js

import CryptoJS from "crypto-js/rabbit";

<script src="cryptojs/rollups/rabbit.js"></script>

﹟调用 CryptoJS.Rabbit

var str = '123456';
var key = '0123456789abcdef';
var iv = '0123456789abcdef';
 
key = CryptoJS.enc.Utf8.parse(key);
iv = CryptoJS.enc.Utf8.parse(iv);
 
var encrypted = CryptoJS.Rabbit.encrypt(str, key, {
    iv: iv
});
 
// 转换为字符串
encrypted = encrypted.toString();
 
var decrypted = CryptoJS.Rabbit.decrypt(encrypted, key, {
    iv: iv
});
 
// 转换为 utf8 字符串
decrypted = CryptoJS.enc.Utf8.stringify(decrypted);

﹟引入 rc4.js

import CryptoJS from "crypto-js/rc4";

<script src="cryptojs/rollups/rc4.js"></script>

﹟调用 CryptoJS.RC4

var str = '123456';
var key = '0123456789abcdef';
var iv = '0123456789abcdef';
 
key = CryptoJS.enc.Utf8.parse(key);
iv = CryptoJS.enc.Utf8.parse(iv);
 
var encrypted = CryptoJS.RC4.encrypt(str, key, {
    iv: iv
});
 
// 转换为字符串
encrypted = encrypted.toString();
 
var decrypted = CryptoJS.RC4.decrypt(encrypted, key, {
    iv: iv
});
 
// 转换为 utf8 字符串
decrypted = CryptoJS.enc.Utf8.stringify(decrypted);
结语

@关于加密的方法就搜罗到这里啦,需要看一下使用技巧可以看看这几篇文章,写得不错:
https://blog.csdn.net/WangYangsea/article/details/78736513
https://blog.csdn.net/lsvtogergo/article/details/80804312

@关于加密方法的搜罗工具可以看看这个:
https://docs.microsoft.com/zh-cn/dotnet/api/?view=netframework-4.8

@关于加密的在线工具开头有,这里再列举出来总的:
https://blog.zhengxianjun.com/online-tool/

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐