crypto-js vs jsrsasign vs node-jose vs jsencrypt vs jsonwebtoken
JavaScript 加密和签名库
crypto-jsjsrsasignnode-josejsencryptjsonwebtoken类似的npm包:

JavaScript 加密和签名库

这些库提供了多种加密、解密、签名和验证功能,适用于在 Web 开发中处理安全性和身份验证。它们各自有不同的功能和使用场景,适合不同的需求和开发环境。选择合适的库可以提高应用程序的安全性和性能。

npm下载趋势

3 年

GitHub Stars 排名

统计详情

npm包名称
下载量
Stars
大小
Issues
发布时间
License
crypto-js25,918,43316,399487 kB2793 年前MIT
jsrsasign2,328,3743,369890 kB363 个月前MIT
node-jose1,945,774720353 kB754 年前Apache-2.0
jsencrypt636,9506,806901 kB1461 年前MIT
jsonwebtoken018,18243.4 kB2161 年前MIT

功能对比: crypto-js vs jsrsasign vs node-jose vs jsencrypt vs jsonwebtoken

加密算法支持

  • crypto-js:

    crypto-js 支持多种加密算法,包括 AES、DES、Rabbit、RC4 等,适合多种加密需求。它的 API 简单易用,适合快速实现加密功能。

  • jsrsasign:

    jsrsasign 提供全面的加密和签名功能,支持多种算法,包括 RSA、ECDSA、HMAC 等,适合复杂的安全需求。

  • node-jose:

    node-jose 支持 JWK 和 JWE,提供多种加密算法,适合现代 Web 应用中的密钥管理和加密需求。

  • jsencrypt:

    jsencrypt 专注于 RSA 加密,支持公钥和私钥的生成、加密和解密,适合需要高安全性的场景。

  • jsonwebtoken:

    jsonwebtoken 主要用于生成和验证 JWT,支持 HMAC 和 RSA 签名算法,适合身份验证和信息交换。

使用场景

  • crypto-js:

    适合需要简单加密和解密的场景,如存储用户密码、加密敏感数据等。

  • jsrsasign:

    适合需要处理复杂签名和验证的场景,如数字签名、证书验证等。

  • node-jose:

    适合需要处理 JWK 和 JWE 的现代 Web 应用,特别是在涉及密钥管理时。

  • jsencrypt:

    适合需要在客户端进行 RSA 加密的场景,如保护用户的敏感信息传输。

  • jsonwebtoken:

    适合需要身份验证和信息交换的场景,如 RESTful API 的用户认证和授权。

学习曲线

  • crypto-js:

    crypto-js 的学习曲线较平缓,适合初学者快速上手,文档清晰,易于理解。

  • jsrsasign:

    jsrsasign 的学习曲线较陡,功能丰富,但需要深入理解加密和签名的原理,适合高级开发者。

  • node-jose:

    node-jose 的学习曲线适中,适合需要处理 JWK 和 JWE 的开发者,文档详细,提供了丰富的示例。

  • jsencrypt:

    jsencrypt 的学习曲线也较平缓,适合需要简单 RSA 加密的开发者,API 简单易用。

  • jsonwebtoken:

    jsonwebtoken 的学习曲线适中,理解 JWT 的概念后,使用起来相对简单,适合中级开发者。

性能

  • crypto-js:

    crypto-js 的性能较好,适合处理小规模数据的加密和解密,速度快,资源占用少。

  • jsrsasign:

    jsrsasign 的性能较好,但在处理复杂签名时可能会影响速度,适合对安全性要求高的场景。

  • node-jose:

    node-jose 的性能较高,适合处理大规模数据的加密和解密,支持多种算法,灵活性强。

  • jsencrypt:

    jsencrypt 在处理大数据时性能可能下降,适合小规模数据的 RSA 加密。

  • jsonwebtoken:

    jsonwebtoken 的性能较高,生成和验证 JWT 的速度快,适合高并发场景。

社区支持

  • crypto-js:

    crypto-js 拥有广泛的社区支持,文档丰富,示例众多,适合初学者。

  • jsrsasign:

    jsrsasign 的社区支持较好,功能强大,适合复杂的安全需求,文档详细。

  • node-jose:

    node-jose 的社区支持逐渐增加,适合现代 Web 应用的密钥管理和加密需求,文档逐步完善。

  • jsencrypt:

    jsencrypt 的社区支持相对较小,但文档清晰,适合简单的 RSA 加密需求。

  • jsonwebtoken:

    jsonwebtoken 拥有强大的社区支持,广泛应用于各种项目,文档和示例丰富。

如何选择: crypto-js vs jsrsasign vs node-jose vs jsencrypt vs jsonwebtoken

  • crypto-js:

    选择 crypto-js 如果你需要一个轻量级的加密库,支持多种加密算法,适合在浏览器和 Node.js 中使用。它提供了简单的 API,适合快速实现基本的加密需求。

  • jsrsasign:

    选择 jsrsasign 如果你需要一个全面的库来处理签名、验证和加密,特别是在涉及到 X.509 证书和 PKI 的场景中。它提供了丰富的功能,适合复杂的安全需求。

  • node-jose:

    选择 node-jose 如果你需要一个专注于 JWK(JSON Web Key)和 JWE(JSON Web Encryption)的库,适合处理现代 Web 应用中的密钥管理和加密需求。它支持多种加密算法,适合需要高度安全性的应用。

  • jsencrypt:

    选择 jsencrypt 如果你需要实现 RSA 加密,特别是在客户端进行加密操作。它适合需要公钥加密和私钥解密的场景,尤其是在处理敏感数据时。

  • jsonwebtoken:

    选择 jsonwebtoken 如果你需要处理 JSON Web Tokens (JWT)。它非常适合用于身份验证和信息交换,支持多种签名算法,易于与 RESTful API 集成。

crypto-js的README

crypto-js

JavaScript library of crypto standards.

Discontinued

Active development of CryptoJS has been discontinued. This library is no longer maintained.

Nowadays, NodeJS and modern browsers have a native Crypto module. The latest version of CryptoJS already uses the native Crypto module for random number generation, since Math.random() is not crypto-safe. Further development of CryptoJS would result in it only being a wrapper of native Crypto. Therefore, development and maintenance has been discontinued, it is time to go for the native crypto module.

Node.js (Install)

Requirements:

  • Node.js
  • npm (Node.js package manager)
npm install crypto-js

Usage

ES6 import for typical API call signing use case:

import sha256 from 'crypto-js/sha256';
import hmacSHA512 from 'crypto-js/hmac-sha512';
import Base64 from 'crypto-js/enc-base64';

const message, nonce, path, privateKey; // ...
const hashDigest = sha256(nonce + message);
const hmacDigest = Base64.stringify(hmacSHA512(path + hashDigest, privateKey));

Modular include:

var AES = require("crypto-js/aes");
var SHA256 = require("crypto-js/sha256");
...
console.log(SHA256("Message"));

Including all libraries, for access to extra methods:

var CryptoJS = require("crypto-js");
console.log(CryptoJS.HmacSHA1("Message", "Key"));

Client (browser)

Requirements:

  • Node.js
  • Bower (package manager for frontend)
bower install crypto-js

Usage

Modular include:

require.config({
    packages: [
        {
            name: 'crypto-js',
            location: 'path-to/bower_components/crypto-js',
            main: 'index'
        }
    ]
});

require(["crypto-js/aes", "crypto-js/sha256"], function (AES, SHA256) {
    console.log(SHA256("Message"));
});

Including all libraries, for access to extra methods:

// Above-mentioned will work or use this simple form
require.config({
    paths: {
        'crypto-js': 'path-to/bower_components/crypto-js/crypto-js'
    }
});

require(["crypto-js"], function (CryptoJS) {
    console.log(CryptoJS.HmacSHA1("Message", "Key"));
});

Usage without RequireJS

<script type="text/javascript" src="path-to/bower_components/crypto-js/crypto-js.js"></script>
<script type="text/javascript">
    var encrypted = CryptoJS.AES(...);
    var encrypted = CryptoJS.SHA256(...);
</script>

API

See: https://cryptojs.gitbook.io/docs/

AES Encryption

Plain text encryption

var CryptoJS = require("crypto-js");

// Encrypt
var ciphertext = CryptoJS.AES.encrypt('my message', 'secret key 123').toString();

// Decrypt
var bytes  = CryptoJS.AES.decrypt(ciphertext, 'secret key 123');
var originalText = bytes.toString(CryptoJS.enc.Utf8);

console.log(originalText); // 'my message'

Object encryption

var CryptoJS = require("crypto-js");

var data = [{id: 1}, {id: 2}]

// Encrypt
var ciphertext = CryptoJS.AES.encrypt(JSON.stringify(data), 'secret key 123').toString();

// Decrypt
var bytes  = CryptoJS.AES.decrypt(ciphertext, 'secret key 123');
var decryptedData = JSON.parse(bytes.toString(CryptoJS.enc.Utf8));

console.log(decryptedData); // [{id: 1}, {id: 2}]

List of modules

  • crypto-js/core
  • crypto-js/x64-core
  • crypto-js/lib-typedarrays

  • crypto-js/md5
  • crypto-js/sha1
  • crypto-js/sha256
  • crypto-js/sha224
  • crypto-js/sha512
  • crypto-js/sha384
  • crypto-js/sha3
  • crypto-js/ripemd160

  • crypto-js/hmac-md5
  • crypto-js/hmac-sha1
  • crypto-js/hmac-sha256
  • crypto-js/hmac-sha224
  • crypto-js/hmac-sha512
  • crypto-js/hmac-sha384
  • crypto-js/hmac-sha3
  • crypto-js/hmac-ripemd160

  • crypto-js/pbkdf2

  • crypto-js/aes
  • crypto-js/tripledes
  • crypto-js/rc4
  • crypto-js/rabbit
  • crypto-js/rabbit-legacy
  • crypto-js/evpkdf

  • crypto-js/format-openssl
  • crypto-js/format-hex

  • crypto-js/enc-latin1
  • crypto-js/enc-utf8
  • crypto-js/enc-hex
  • crypto-js/enc-utf16
  • crypto-js/enc-base64

  • crypto-js/mode-cfb
  • crypto-js/mode-ctr
  • crypto-js/mode-ctr-gladman
  • crypto-js/mode-ofb
  • crypto-js/mode-ecb

  • crypto-js/pad-pkcs7
  • crypto-js/pad-ansix923
  • crypto-js/pad-iso10126
  • crypto-js/pad-iso97971
  • crypto-js/pad-zeropadding
  • crypto-js/pad-nopadding

Release notes

4.2.0

Change default hash algorithm and iteration's for PBKDF2 to prevent weak security by using the default configuration.

Custom KDF Hasher

Blowfish support

4.1.1

Fix module order in bundled release.

Include the browser field in the released package.json.

4.1.0

Added url safe variant of base64 encoding. 357

Avoid webpack to add crypto-browser package. 364

4.0.0

This is an update including breaking changes for some environments.

In this version Math.random() has been replaced by the random methods of the native crypto module.

For this reason CryptoJS might not run in some JavaScript environments without native crypto module. Such as IE 10 or before or React Native.

3.3.0

Rollback, 3.3.0 is the same as 3.1.9-1.

The move of using native secure crypto module will be shifted to a new 4.x.x version. As it is a breaking change the impact is too big for a minor release.

3.2.1

The usage of the native crypto module has been fixed. The import and access of the native crypto module has been improved.

3.2.0

In this version Math.random() has been replaced by the random methods of the native crypto module.

For this reason CryptoJS might does not run in some JavaScript environments without native crypto module. Such as IE 10 or before.

If it's absolute required to run CryptoJS in such an environment, stay with 3.1.x version. Encrypting and decrypting stays compatible. But keep in mind 3.1.x versions still use Math.random() which is cryptographically not secure, as it's not random enough.

This version came along with CRITICAL BUG.

DO NOT USE THIS VERSION! Please, go for a newer version!

3.1.x

The 3.1.x are based on the original CryptoJS, wrapped in CommonJS modules.