crypto-js vs jsencrypt vs node-forge vs openpgp vs tweetnacl
JavaScript Cryptography Libraries
crypto-jsjsencryptnode-forgeopenpgptweetnaclSimilar Packages:

JavaScript Cryptography Libraries

JavaScript cryptography libraries provide developers with tools to implement encryption, decryption, and secure data handling in web applications. These libraries are essential for ensuring data integrity, confidentiality, and authentication in various applications, from simple data protection to complex secure communications. Each library has its unique features, strengths, and use cases, making them suitable for different scenarios in web development.

Npm Package Weekly Downloads Trend

3 Years

Github Stars Ranking

Stat Detail

Package
Downloads
Stars
Size
Issues
Publish
License
crypto-js016,392487 kB2752 years agoMIT
jsencrypt06,808901 kB1417 months agoMIT
node-forge05,2741.64 MB4583 months ago(BSD-3-Clause OR GPL-2.0)
openpgp05,94017.3 MB393 months agoLGPL-3.0+
tweetnacl01,918-96 years agoUnlicense

Feature Comparison: crypto-js vs jsencrypt vs node-forge vs openpgp vs tweetnacl

Encryption Algorithms

  • crypto-js:

    Crypto-JS supports various encryption algorithms such as AES, DES, and Triple DES, making it versatile for different encryption needs. It is easy to use and integrates well with existing JavaScript applications.

  • jsencrypt:

    JSEncrypt specifically implements RSA encryption, which is suitable for secure key exchange and data encryption. It allows for easy generation of public/private key pairs and is focused on asymmetric encryption.

  • node-forge:

    Node-Forge provides a wide range of encryption algorithms, including symmetric (AES, DES) and asymmetric (RSA, DSA) encryption, along with support for cryptographic protocols like TLS. It is a more comprehensive library for complex cryptographic tasks.

  • openpgp:

    OpenPGP.js implements the OpenPGP standard, offering robust encryption options for secure communications. It supports various algorithms, including RSA and ElGamal, and is designed for secure email and file encryption.

  • tweetnacl:

    TweetNaCl focuses on modern cryptographic primitives, providing authenticated encryption (using XSalsa20) and digital signatures (using Ed25519). It is optimized for performance and security.

Ease of Use

  • crypto-js:

    Crypto-JS is straightforward to use, with a simple API that allows developers to quickly implement encryption and hashing without deep cryptographic knowledge. It's suitable for beginners.

  • jsencrypt:

    JSEncrypt has a user-friendly API for RSA encryption, making it easy to integrate into applications that require public/private key functionality. It's designed for developers who need basic RSA features without complexity.

  • node-forge:

    Node-Forge has a steeper learning curve due to its comprehensive feature set, but it provides extensive documentation and examples, making it manageable for developers familiar with cryptography.

  • openpgp:

    OpenPGP.js is relatively easy to use for developers familiar with the OpenPGP standard. It provides a clear API for implementing secure communications but may require understanding of PGP concepts.

  • tweetnacl:

    TweetNaCl is designed for simplicity and performance, providing a minimalistic API that is easy to understand and use, making it suitable for developers looking for straightforward cryptographic solutions.

Performance

  • crypto-js:

    Crypto-JS is lightweight and optimized for performance, making it suitable for client-side applications where speed is crucial. However, it may not be as secure as other libraries for high-stakes applications.

  • jsencrypt:

    JSEncrypt is efficient for RSA operations but can be slower compared to symmetric encryption methods. It is best used for small data sizes due to RSA's computational overhead.

  • node-forge:

    Node-Forge is designed for flexibility and performance but may not be as fast as specialized libraries for specific tasks. It's suitable for applications needing a broad range of cryptographic functions.

  • openpgp:

    OpenPGP.js is optimized for secure communications but can be slower due to the complexity of the algorithms involved. It's best for applications where security is prioritized over speed.

  • tweetnacl:

    TweetNaCl is highly optimized for performance, providing fast cryptographic operations suitable for real-time applications, making it ideal for performance-critical environments.

Security Features

  • crypto-js:

    Crypto-JS provides basic security features but lacks advanced options like key management and secure key storage, making it less suitable for high-security applications.

  • jsencrypt:

    JSEncrypt focuses on RSA encryption, providing secure key generation and management. However, it does not cover other cryptographic needs, which may require additional libraries.

  • node-forge:

    Node-Forge offers extensive security features, including support for various standards and protocols, making it suitable for applications requiring high security and compliance.

  • openpgp:

    OpenPGP.js adheres to the OpenPGP standard, ensuring robust security for encrypted communications. It includes features like key signing and verification, making it ideal for secure messaging.

  • tweetnacl:

    TweetNaCl emphasizes security through simplicity, providing modern cryptographic primitives that are resistant to common attacks, making it a secure choice for developers.

Community and Support

  • crypto-js:

    Crypto-JS has a large user base and community support, with many resources available for troubleshooting and implementation guidance, making it accessible for developers.

  • jsencrypt:

    JSEncrypt has a smaller community but is well-documented, providing enough resources for developers to implement RSA encryption effectively.

  • node-forge:

    Node-Forge has a strong community and extensive documentation, offering support for a wide range of cryptographic tasks, making it suitable for developers needing comprehensive help.

  • openpgp:

    OpenPGP.js benefits from a dedicated community focused on secure communications, providing ample resources and support for implementing the OpenPGP standard.

  • tweetnacl:

    TweetNaCl has a smaller community but is well-regarded for its performance and security. Documentation is available, though it may not be as extensive as larger libraries.

How to Choose: crypto-js vs jsencrypt vs node-forge vs openpgp vs tweetnacl

  • crypto-js:

    Choose Crypto-JS for lightweight cryptographic operations and when you need a simple solution for hashing and encryption without the overhead of additional features.

  • jsencrypt:

    Select JSEncrypt if you require RSA encryption and decryption specifically, especially for scenarios involving public/private key pairs, such as secure data transmission over the web.

  • node-forge:

    Opt for Node-Forge when you need a comprehensive solution that includes support for various cryptographic standards, including TLS, PKI, and more complex cryptographic tasks.

  • openpgp:

    Use OpenPGP.js if you need to implement OpenPGP standard encryption, which is ideal for secure email communications and file encryption, ensuring compliance with widely accepted encryption standards.

  • tweetnacl:

    Choose TweetNaCl for high-performance cryptographic operations with a focus on simplicity and security, particularly for applications requiring authenticated encryption and digital signatures.

README for crypto-js

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.