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

Password hashing libraries are essential tools in web development for securely storing user passwords. They provide algorithms that transform plaintext passwords into hashed values, making it difficult for attackers to retrieve the original passwords even if they gain access to the database. Each library has its own strengths, weaknesses, and use cases, which can significantly impact the security and performance of an application. Choosing the right library is crucial for maintaining user trust and data integrity in any web application.

Package Weekly Downloads Trend
Github Stars Ranking
Stat Detail
Package
Downloads
Stars
Size
Issues
Publish
License
bcryptjs2,614,9503,606112 kB288 days agoBSD-3-Clause
bcrypt1,968,3847,573111 kB492 years agoMIT
argon2372,5141,937866 kB36 months agoMIT
bcrypt-nodejs55,564---12 years ago-
Feature Comparison: bcryptjs vs bcrypt vs argon2 vs bcrypt-nodejs

Security Strength

  • bcryptjs:

    Bcryptjs is a pure JavaScript implementation of Bcrypt, providing similar security features. However, it may not be as fast as native implementations, which could be a concern for applications with high hashing demands.

  • bcrypt:

    Bcrypt is a strong hashing algorithm that incorporates a work factor, allowing you to adjust the computational cost of hashing. While it is secure, it is not as resistant to modern attacks as Argon2, especially against brute-force attacks using specialized hardware.

  • argon2:

    Argon2 is considered the most secure password hashing algorithm as it won the Password Hashing Competition in 2015. It is designed to be resistant to various attack vectors, including GPU and ASIC attacks, and allows for customizable memory and time costs to enhance security.

  • bcrypt-nodejs:

    Bcrypt-nodejs offers the same security features as Bcrypt, but being a pure JavaScript implementation, it may not be as optimized for performance. It is still secure but may lag behind native implementations in speed.

Performance

  • bcryptjs:

    Bcryptjs, being a pure JavaScript implementation, is slower than native alternatives. It is suitable for smaller applications or those where performance is not the primary concern, but may struggle under high demand.

  • bcrypt:

    Bcrypt is generally slower than other algorithms due to its computational cost, which is a feature designed to enhance security. However, its performance is adequate for most applications, and the work factor can be adjusted to balance security and performance.

  • argon2:

    Argon2 is designed for performance and can be tuned to use more memory and processing time, which can slow down brute-force attacks. However, this configurability means it can be optimized for different environments and use cases, potentially leading to better performance in secure applications.

  • bcrypt-nodejs:

    Bcrypt-nodejs may have performance issues compared to native Bcrypt implementations, as it is not optimized for speed. This can lead to slower hashing times, especially under heavy load or in high-traffic applications.

Ease of Use

  • bcryptjs:

    Bcryptjs is also easy to use and integrate, especially for projects that avoid native dependencies. Its simplicity makes it a good choice for developers looking for a lightweight solution.

  • bcrypt:

    Bcrypt is easy to use with a simple API, and its widespread adoption means that many developers are familiar with it. It has extensive documentation and community support, making implementation straightforward.

  • argon2:

    Argon2 has a straightforward API, but its advanced features may require a deeper understanding of hashing parameters. It is well-documented, making it easier for developers to implement securely.

  • bcrypt-nodejs:

    Bcrypt-nodejs is easy to integrate due to its pure JavaScript nature, which eliminates the need for native bindings. However, it may require additional considerations for performance in production environments.

Community and Support

  • bcryptjs:

    Bcryptjs has a decent community and is well-documented, but it may not have the same level of support as Bcrypt. It is still a viable option for developers looking for a pure JavaScript solution.

  • bcrypt:

    Bcrypt has a large community and extensive documentation, making it one of the most supported password hashing libraries available. There are numerous resources, tutorials, and community contributions that can help developers implement it effectively.

  • argon2:

    Argon2 is gaining popularity and has a growing community, but it may not have as extensive support as older libraries. Its modern approach means that resources and examples are increasing but may still be limited compared to more established libraries.

  • bcrypt-nodejs:

    Bcrypt-nodejs has a smaller community compared to Bcrypt, but it is still supported by many developers. However, resources and examples may not be as plentiful as those for Bcrypt.

Compatibility

  • bcryptjs:

    Bcryptjs is compatible with any JavaScript environment, including Node.js and browsers. Its pure JavaScript nature allows for easy integration without worrying about native dependencies.

  • bcrypt:

    Bcrypt is widely compatible across different platforms and programming languages, making it a safe choice for most applications. It has been integrated into many frameworks and libraries, ensuring broad support.

  • argon2:

    Argon2 is compatible with modern environments and is supported by various programming languages. However, it may require additional libraries or dependencies in some cases, depending on the implementation.

  • bcrypt-nodejs:

    Bcrypt-nodejs is designed to work in environments where native bindings are not feasible, making it a good choice for JavaScript-only projects. However, its performance may vary depending on the environment.

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

    Choose Bcryptjs if you need a pure JavaScript implementation of Bcrypt that is lightweight and easy to integrate into your project. It is suitable for applications where you want to avoid native dependencies, but it may be slower than native alternatives.

  • bcrypt:

    Choose Bcrypt if you are looking for a widely adopted and well-tested solution that has been around for years. It is suitable for most applications and provides a good balance between security and performance, although it may not be as resistant to certain types of attacks as Argon2.

  • argon2:

    Choose Argon2 if you need the most secure and modern hashing algorithm available. It is designed to resist GPU-based attacks and is highly configurable, allowing you to adjust memory usage and execution time to balance security and performance.

  • bcrypt-nodejs:

    Choose Bcrypt-nodejs if you prefer a pure JavaScript implementation of Bcrypt that does not require native bindings, making it easier to use in environments where native compilation is not feasible. However, it may have performance drawbacks compared to native implementations.

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).