Gathering detailed insights and metrics for bcryptjs
Gathering detailed insights and metrics for bcryptjs
Gathering detailed insights and metrics for bcryptjs
Gathering detailed insights and metrics for bcryptjs
Optimized bcrypt in JavaScript with zero dependencies, with TypeScript support.
npm install bcryptjs
Typescript
Module System
Node Version
NPM Version
JavaScript (99.46%)
TypeScript (0.54%)
Total Downloads
482,559,235
Last Day
246,817
Last Week
3,412,935
Last Month
14,733,601
Last Year
130,604,028
NOASSERTION License
3,725 Stars
125 Commits
278 Forks
46 Watchers
1 Branches
8 Contributors
Updated on Aug 29, 2025
Latest Version
3.0.2
Package Id
bcryptjs@3.0.2
Unpacked Size
109.62 kB
Size
31.61 kB
File Count
11
NPM Version
10.9.2
Node Version
23.8.0
Published on
Feb 18, 2025
Cumulative downloads
Total Downloads
Last Day
-1.1%
246,817
Compared to previous day
Last Week
0.1%
3,412,935
Compared to previous week
Last Month
3.4%
14,733,601
Compared to previous month
Last Year
36.6%
130,604,028
Compared to previous year
4
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.
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.
The package exports an ECMAScript module with an UMD fallback.
$> npm install bcryptjs
1import bcrypt from "bcryptjs";
https://cdn.jsdelivr.net/gh/dcodeIO/bcrypt.js@TAG/index.js
(ESM)https://cdn.jsdelivr.net/npm/bcryptjs@VERSION/index.js
(ESM)https://cdn.jsdelivr.net/npm/bcryptjs@VERSION/umd/index.js
(UMD)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.
To hash a password:
1const salt = bcrypt.genSaltSync(10); 2const hash = bcrypt.hashSync("B4c0/\/", salt); 3// Store hash in your password DB
To check a password:
1// Load hash from your password DB
2bcrypt.compareSync("B4c0/\/", hash); // true
3bcrypt.compareSync("not_bacon", hash); // false
Auto-gen a salt and hash:
1const hash = bcrypt.hashSync("bacon", 10);
To hash a password:
1const salt = await bcrypt.genSalt(10); 2const hash = await bcrypt.hash("B4c0/\/", salt); 3// Store hash in your password DB
1bcrypt.genSalt(10, (err, salt) => { 2 bcrypt.hash("B4c0/\/", salt, function (err, hash) { 3 // Store hash in your password DB 4 }); 5});
To check a password:
1// Load hash from your password DB 2await bcrypt.compare("B4c0/\/", hash); // true 3await bcrypt.compare("not_bacon", hash); // false
1// Load hash from your password DB 2bcrypt.compare("B4c0/\/", hash, (err, res) => { 3 // res === true 4}); 5bcrypt.compare("not_bacon", hash, (err, res) => { 6 // res === false 7});
Auto-gen a salt and hash:
1await bcrypt.hash("B4c0/\/", 10); 2// Store hash in your password DB
1bcrypt.hash("B4c0/\/", 10, (err, hash) => { 2 // Store hash in your password DB 3});
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: bcrypt <input> [rounds|salt]
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.
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 the UMD fallback:
$> npm run build
Running the tests:
$> npm test
Based on work started by Shane Girish at bcrypt-nodejs, which is itself based on javascript-bcrypt (New BSD-licensed).
No vulnerabilities found.
@types/bcryptjs
Stub TypeScript definitions entry for bcryptjs, which provides its own types definitions
bcryptjs-then
bcryptjs as promised
bcrypt-ts
bcrypt written in typescript
bcryptjs-react
Webpack v5 - Optimized bcrypt in plain JavaScript with zero dependencies. Compatible to 'bcrypt'.