crypto-js vs sjcl vs bcryptjs vs node-forge
JavaScript Cryptography Libraries
crypto-jssjclbcryptjsnode-forgeSimilar Packages:

JavaScript Cryptography Libraries

Cryptography libraries in JavaScript provide developers with tools to secure data through encryption, hashing, and other security protocols. These libraries are essential for protecting sensitive information, ensuring data integrity, and implementing secure authentication mechanisms in web applications. The choice of library can significantly impact the security and performance of an application, making it crucial to understand the strengths and weaknesses of each option available.

Npm Package Weekly Downloads Trend

3 Years

Github Stars Ranking

Stat Detail

Package
Downloads
Stars
Size
Issues
Publish
License
crypto-js12,254,56016,382487 kB2752 years agoMIT
sjcl204,9027,232-1177 years ago(BSD-2-Clause OR GPL-2.0-only)
bcryptjs03,784112 kB14 months agoBSD-3-Clause
node-forge05,2711.64 MB4583 months ago(BSD-3-Clause OR GPL-2.0)

Feature Comparison: crypto-js vs sjcl vs bcryptjs vs node-forge

Primary Use Case

  • crypto-js:

    crypto-js is a general-purpose cryptography library that supports multiple encryption and hashing algorithms, making it suitable for a wide range of applications including data encryption and integrity verification.

  • sjcl:

    sjcl is focused on client-side encryption and is optimized for performance and security, making it ideal for applications that need to encrypt data in the browser.

  • bcryptjs:

    bcryptjs is primarily used for securely hashing passwords. It is designed to be slow to thwart brute-force attacks, making it ideal for user authentication systems.

  • node-forge:

    node-forge is a comprehensive library that can handle various cryptographic tasks such as encryption, decryption, and certificate management, making it suitable for applications that require secure communications and data protection.

Performance

  • crypto-js:

    crypto-js offers a balance between performance and security, allowing for fast encryption and decryption processes. However, performance can vary based on the chosen algorithm.

  • sjcl:

    sjcl is designed for performance and is lightweight, making it suitable for client-side applications where speed is essential without sacrificing security.

  • bcryptjs:

    bcryptjs is slower than many other hashing algorithms due to its design, which is intentional to enhance security. This makes it less suitable for scenarios requiring high-speed hashing but excellent for password storage.

  • node-forge:

    node-forge is relatively performant but can be slower than specialized libraries for specific tasks due to its comprehensive feature set. It is best used where flexibility is needed over raw speed.

Security Features

  • crypto-js:

    crypto-js provides a variety of encryption algorithms, but developers must ensure proper implementation to avoid vulnerabilities. It does not include built-in salting for hashes, requiring additional care.

  • sjcl:

    sjcl implements modern cryptographic algorithms and practices, ensuring strong security for client-side encryption, but developers must be cautious about potential pitfalls in implementation.

  • bcryptjs:

    bcryptjs includes built-in salting and is resistant to rainbow table attacks, making it a secure choice for password hashing.

  • node-forge:

    node-forge supports various cryptographic standards and protocols, providing a robust security framework for applications that require secure communications.

Ease of Use

  • crypto-js:

    crypto-js has a more complex API due to its wide range of features, which may require a steeper learning curve for new users.

  • sjcl:

    sjcl is designed to be easy to use with a simple API, making it accessible for developers looking to implement encryption quickly.

  • bcryptjs:

    bcryptjs has a straightforward API specifically for password hashing, making it easy to implement for developers focused on authentication.

  • node-forge:

    node-forge offers a comprehensive API that can be complex for beginners but provides extensive documentation to assist developers in implementation.

Community and Support

  • crypto-js:

    crypto-js is also widely used, with a decent community and resources, but may not have as extensive support as some other libraries.

  • sjcl:

    sjcl has a smaller community compared to others, but it is well-documented and supported by its maintainers, making it reliable for developers.

  • bcryptjs:

    bcryptjs has a strong community and is widely used, ensuring good support and documentation available for developers.

  • node-forge:

    node-forge has a dedicated community and is actively maintained, providing good support and updates for developers.

How to Choose: crypto-js vs sjcl vs bcryptjs vs node-forge

  • crypto-js:

    Select crypto-js for a versatile library that supports various encryption algorithms and hashing functions. It is suitable for applications that require both symmetric and asymmetric encryption, as well as hashing, and is easy to integrate into existing projects.

  • sjcl:

    Choose sjcl for a lightweight and efficient library focused on modern cryptographic algorithms. It is particularly useful for client-side encryption and offers a simple API for developers looking to implement cryptography without the overhead of larger libraries.

  • bcryptjs:

    Choose bcryptjs if you need a reliable solution for hashing passwords securely. It is specifically designed for this purpose and implements the bcrypt hashing algorithm, which is resistant to brute-force attacks and includes a salt to enhance security.

  • node-forge:

    Opt for node-forge if you need a comprehensive toolkit for implementing cryptographic protocols, including TLS. It provides a wide range of features, including certificate generation and management, making it ideal for applications that require complex cryptographic operations.

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.