bcryptjs vs bcrypt vs bcrypt-nodejs
Password Hashing Libraries Comparison
1 Year
bcryptjsbcryptbcrypt-nodejsSimilar Packages:
What's Password Hashing Libraries?

Password hashing libraries are essential tools in web development for securely storing user passwords. They implement cryptographic algorithms to transform plain-text passwords into hashed values, making it difficult for unauthorized users to retrieve the original passwords. These libraries typically provide functionalities for hashing passwords, comparing hashed values, and managing salt to enhance security. Choosing the right library is crucial for ensuring the security and performance of applications that handle sensitive user data.

Package Weekly Downloads Trend
Github Stars Ranking
Stat Detail
Package
Downloads
Stars
Size
Issues
Publish
License
bcryptjs2,599,2733,604112 kB287 days agoBSD-3-Clause
bcrypt1,941,4337,573111 kB492 years agoMIT
bcrypt-nodejs54,551---12 years ago-
Feature Comparison: bcryptjs vs bcrypt vs bcrypt-nodejs

Performance

  • bcryptjs:

    bcryptjs is also a pure JavaScript implementation, offering decent performance but generally slower than bcrypt. It is ideal for projects that require simplicity and ease of integration without the need for native compilation.

  • bcrypt:

    bcrypt is optimized for performance through native bindings, which provide faster hashing and comparison operations. This makes it suitable for applications with high user traffic, where speed is essential.

  • bcrypt-nodejs:

    bcrypt-nodejs is implemented entirely in JavaScript, which may result in slower performance compared to bcrypt. It is more suited for smaller applications or development environments where ease of use is prioritized over speed.

Ease of Use

  • bcryptjs:

    bcryptjs offers a simple and intuitive API, making it easy for developers to implement password hashing and verification without any complex setup. It is particularly useful for quick prototypes or smaller projects.

  • bcrypt:

    bcrypt requires native compilation, which can complicate installation and deployment, especially in serverless or containerized environments. However, once set up, it offers a straightforward API for hashing and verifying passwords.

  • bcrypt-nodejs:

    bcrypt-nodejs is easy to install and use, as it does not require any native dependencies. This makes it a good choice for developers looking for a hassle-free setup without the need for additional build tools.

Security Features

  • bcryptjs:

    bcryptjs supports salting and provides a configurable work factor, allowing developers to balance security and performance. However, it may not be as robust as bcrypt in high-security environments, making it more suitable for less critical applications.

  • bcrypt:

    bcrypt incorporates salting and adjustable work factors, which enhance security by making it more difficult for attackers to use precomputed hash tables (rainbow tables) to crack passwords. The work factor can be adjusted to increase hashing time as computational power increases over time.

  • bcrypt-nodejs:

    bcrypt-nodejs also supports salting and adjustable work factors, but being a pure JavaScript implementation, it may not be as secure as bcrypt in high-performance scenarios. It is still effective for many applications but may lag behind in security features compared to its native counterpart.

Compatibility

  • bcryptjs:

    bcryptjs is purely JavaScript and works well in any JavaScript environment, including Node.js and browser-based applications. Its compatibility makes it a flexible option for developers working within the JavaScript ecosystem.

  • bcrypt:

    bcrypt is compatible with various platforms and languages due to its native bindings, making it a versatile choice for applications that may need to interface with other languages or frameworks.

  • bcrypt-nodejs:

    bcrypt-nodejs is designed to work seamlessly in JavaScript environments, making it a good choice for Node.js applications. However, it may not be as compatible with other programming languages or platforms as bcrypt.

Community Support

  • bcryptjs:

    bcryptjs enjoys a growing community and good documentation, providing developers with ample resources and examples to assist with implementation. Its popularity in the JavaScript community ensures ongoing support and updates.

  • bcrypt:

    bcrypt has a large community and extensive documentation, making it easy to find resources, tutorials, and support. This can be beneficial for developers facing challenges during implementation.

  • bcrypt-nodejs:

    bcrypt-nodejs has a smaller community compared to bcrypt, which may result in fewer resources and community support. However, it is still widely used and has sufficient documentation for most use cases.

How to Choose: bcryptjs vs bcrypt vs bcrypt-nodejs
  • bcryptjs:

    Choose bcryptjs if you need a pure JavaScript implementation that is lightweight and easy to integrate into your project. It is a good choice for applications where performance is less critical, and it provides a straightforward API for hashing and comparing passwords.

  • bcrypt:

    Choose bcrypt if you need a widely-used, robust library that utilizes native bindings for performance. It is suitable for production environments where security and speed are critical, but it requires native compilation, which may complicate deployment.

  • bcrypt-nodejs:

    Choose bcrypt-nodejs if you prefer a pure JavaScript implementation that is easier to install and use in environments where native compilation is not feasible. However, it may not perform as well as its native counterpart, making it less suitable for high-load applications.

README for bcryptjs

bcrypt.js

Optimized bcrypt in JavaScript with zero dependencies, with TypeScript support. Compatible to the C++ bcrypt binding on Node.js and also working in the browser.

Build Status Publish Status npm

Security considerations

Besides incorporating a salt to protect against rainbow table attacks, bcrypt is an adaptive function: over time, the iteration count can be increased to make it slower, so it remains resistant to brute-force search attacks even with increasing computation power. (see)

While bcrypt.js is compatible to the C++ bcrypt binding, it is written in pure JavaScript and thus slower (about 30%), effectively reducing the number of iterations that can be processed in an equal time span.

The maximum input length is 72 bytes (note that UTF-8 encoded characters use up to 4 bytes) and the length of generated hashes is 60 characters. Note that maximum input length is not implicitly checked by the library for compatibility with the C++ binding on Node.js, but should be checked with bcrypt.truncates(password) where necessary.

Usage

The package exports an ECMAScript module with an UMD fallback.

$> npm install bcryptjs
import bcrypt from "bcryptjs";

Usage with a CDN

  • From GitHub via jsDelivr:
    https://cdn.jsdelivr.net/gh/dcodeIO/bcrypt.js@TAG/index.js (ESM)
  • From npm via jsDelivr:
    https://cdn.jsdelivr.net/npm/bcryptjs@VERSION/index.js (ESM)
    https://cdn.jsdelivr.net/npm/bcryptjs@VERSION/umd/index.js (UMD)
  • From npm via unpkg:
    https://unpkg.com/bcryptjs@VERSION/index.js (ESM)
    https://unpkg.com/bcryptjs@VERSION/umd/index.js (UMD)

Replace TAG respectively VERSION with a specific version or omit it (not recommended in production) to use latest.

When using the ESM variant in a browser, the crypto import needs to be stubbed out, for example using an import map. Bundlers should omit it automatically.

Usage - Sync

To hash a password:

const salt = bcrypt.genSaltSync(10);
const hash = bcrypt.hashSync("B4c0/\/", salt);
// Store hash in your password DB

To check a password:

// Load hash from your password DB
bcrypt.compareSync("B4c0/\/", hash); // true
bcrypt.compareSync("not_bacon", hash); // false

Auto-gen a salt and hash:

const hash = bcrypt.hashSync("bacon", 10);

Usage - Async

To hash a password:

const salt = await bcrypt.genSalt(10);
const hash = await bcrypt.hash("B4c0/\/", salt);
// Store hash in your password DB
bcrypt.genSalt(10, (err, salt) => {
  bcrypt.hash("B4c0/\/", salt, function (err, hash) {
    // Store hash in your password DB
  });
});

To check a password:

// Load hash from your password DB
await bcrypt.compare("B4c0/\/", hash); // true
await bcrypt.compare("not_bacon", hash); // false
// Load hash from your password DB
bcrypt.compare("B4c0/\/", hash, (err, res) => {
  // res === true
});
bcrypt.compare("not_bacon", hash, (err, res) => {
  // res === false
});

Auto-gen a salt and hash:

await bcrypt.hash("B4c0/\/", 10);
// Store hash in your password DB
bcrypt.hash("B4c0/\/", 10, (err, hash) => {
  // Store hash in your password DB
});

Note: Under the hood, asynchronous APIs split an operation into small chunks. After the completion of a chunk, the execution of the next chunk is placed on the back of the JS event queue, efficiently yielding for other computation to execute.

Usage - Command Line

Usage: bcrypt <input> [rounds|salt]

API

Callback types

  • Callback<T>: (err: Error | null, result?: T) => void
    Called with an error on failure or a value of type T upon success.

  • ProgressCallback: (percentage: number) => void
    Called with the percentage of rounds completed (0.0 - 1.0), maximally once per MAX_EXECUTION_TIME = 100 ms.

  • RandomFallback: (length: number) => number[]
    Called to obtain random bytes when both Web Crypto API and Node.js crypto are not available.

Functions

  • bcrypt.genSaltSync(rounds?: number): string
    Synchronously generates a salt. Number of rounds defaults to 10 when omitted.

  • bcrypt.genSalt(rounds?: number): Promise<string>
    Asynchronously generates a salt. Number of rounds defaults to 10 when omitted.

  • bcrypt.genSalt([rounds: number, ]callback: Callback<string>): void
    Asynchronously generates a salt. Number of rounds defaults to 10 when omitted.

  • bcrypt.truncates(password: string): boolean
    Tests if a password will be truncated when hashed, that is its length is greater than 72 bytes when converted to UTF-8.

  • bcrypt.hashSync(password: string, salt?: number | string): string Synchronously generates a hash for the given password. Number of rounds defaults to 10 when omitted.

  • bcrypt.hash(password: string, salt: number | string): Promise<string>
    Asynchronously generates a hash for the given password.

  • bcrypt.hash(password: string, salt: number | string, callback: Callback<string>, progressCallback?: ProgressCallback): void
    Asynchronously generates a hash for the given password.

  • bcrypt.compareSync(password: string, hash: string): boolean
    Synchronously tests a password against a hash.

  • bcrypt.compare(password: string, hash: string): Promise<boolean>
    Asynchronously compares a password against a hash.

  • bcrypt.compare(password: string, hash: string, callback: Callback<boolean>, progressCallback?: ProgressCallback)
    Asynchronously compares a password against a hash.

  • bcrypt.getRounds(hash: string): number
    Gets the number of rounds used to encrypt the specified hash.

  • bcrypt.getSalt(hash: string): string
    Gets the salt portion from a hash. Does not validate the hash.

  • bcrypt.setRandomFallback(random: RandomFallback): void
    Sets the pseudo random number generator to use as a fallback if neither Web Crypto API nor Node.js crypto are available. Please note: It is highly important that the PRNG used is cryptographically secure and that it is seeded properly!

Building

Building the UMD fallback:

$> npm run build

Running the tests:

$> npm test

Credits

Based on work started by Shane Girish at bcrypt-nodejs, which is itself based on javascript-bcrypt (New BSD-licensed).