@rudderjs/hash 1.0.0 → 1.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -3
- package/boost/guidelines.md +66 -0
- package/package.json +7 -3
package/README.md
CHANGED
|
@@ -24,11 +24,10 @@ export default {
|
|
|
24
24
|
argon2: { memory: 65536, time: 3, threads: 4 },
|
|
25
25
|
}
|
|
26
26
|
|
|
27
|
-
// bootstrap/providers.ts
|
|
28
|
-
import { hash } from '@rudderjs/hash'
|
|
29
|
-
export default [hash(configs.hash), ...]
|
|
30
27
|
```
|
|
31
28
|
|
|
29
|
+
`HashProvider` is picked up by [auto-discovery](https://github.com/rudderjs/rudder/blob/main/docs/guide/service-providers.md#auto-discovery) — `pnpm rudder providers:discover` is all that's needed.
|
|
30
|
+
|
|
32
31
|
## Usage
|
|
33
32
|
|
|
34
33
|
```ts
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
# @rudderjs/hash
|
|
2
|
+
|
|
3
|
+
## Overview
|
|
4
|
+
|
|
5
|
+
One-way password hashing — bcrypt (default, pure JS via `bcryptjs`, no native build) and argon2 (optional peer, native). Provides the `Hash` facade with `make`, `check`, and `needsRehash`. **Required peer of `@rudderjs/auth`** — `EloquentUserProvider.validateCredentials()` calls `hashCheck()` internally, and `HashProvider` must appear before `AuthProvider` in the providers array.
|
|
6
|
+
|
|
7
|
+
## Key Patterns
|
|
8
|
+
|
|
9
|
+
### Setup
|
|
10
|
+
|
|
11
|
+
```ts
|
|
12
|
+
// config/hash.ts
|
|
13
|
+
export default {
|
|
14
|
+
driver: 'bcrypt',
|
|
15
|
+
bcrypt: { rounds: 12 },
|
|
16
|
+
argon2: { memory: 65536, time: 3, threads: 4 },
|
|
17
|
+
} satisfies HashConfig
|
|
18
|
+
|
|
19
|
+
// bootstrap/providers.ts — HashProvider MUST come before AuthProvider
|
|
20
|
+
import { HashProvider } from '@rudderjs/hash'
|
|
21
|
+
import { AuthProvider } from '@rudderjs/auth'
|
|
22
|
+
|
|
23
|
+
export default [
|
|
24
|
+
HashProvider,
|
|
25
|
+
AuthProvider,
|
|
26
|
+
]
|
|
27
|
+
```
|
|
28
|
+
|
|
29
|
+
### Usage
|
|
30
|
+
|
|
31
|
+
```ts
|
|
32
|
+
import { Hash } from '@rudderjs/hash'
|
|
33
|
+
|
|
34
|
+
const hashed = await Hash.make('password') // hash on register/password-change
|
|
35
|
+
const valid = await Hash.check('password', hashed) // verify on login
|
|
36
|
+
|
|
37
|
+
if (Hash.needsRehash(hashed)) {
|
|
38
|
+
// Rounds changed since this hash was made — rehash after successful login
|
|
39
|
+
const upgraded = await Hash.make('password')
|
|
40
|
+
await User.update(user.id, { password: upgraded })
|
|
41
|
+
}
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
### Bcrypt (default)
|
|
45
|
+
|
|
46
|
+
Uses `bcryptjs` — pure JavaScript, no native compilation. Slower than native bcrypt but works everywhere Node runs (including Bun, Deno, Cloudflare Workers). Default rounds: 12.
|
|
47
|
+
|
|
48
|
+
### Argon2 (optional)
|
|
49
|
+
|
|
50
|
+
Install the peer: `pnpm add argon2`. Faster for the same security level, but requires native build (fails on runtimes without native bindings).
|
|
51
|
+
|
|
52
|
+
## Common Pitfalls
|
|
53
|
+
|
|
54
|
+
- **`HashProvider` after `AuthProvider` in providers array.** Auth's `validateCredentials` looks up `Hash` at boot; if `HashProvider` hasn't run yet, auth throws. Order matters.
|
|
55
|
+
- **`argon2` not installed.** The driver lazy-loads the SDK. Set `driver: 'argon2'` without installing → error on first `Hash.make()`.
|
|
56
|
+
- **Mixing drivers across environments.** A hash generated with bcrypt won't verify with argon2 (different algorithm). Pick one driver per deployment; use `needsRehash()` + re-hash-on-login to migrate gradually.
|
|
57
|
+
- **Rounds tuning.** 12 is a reasonable default for 2026. Going below 10 is insecure; going above 14 gets visibly slow on every login. Benchmark on your hardware before changing.
|
|
58
|
+
- **Hashing non-passwords.** `@rudderjs/hash` is for passwords specifically (one-way, intentionally slow). For API tokens, use `@rudderjs/crypt` (symmetric encryption) or SHA-256 hashing as appropriate — Passport uses SHA-256 for client secrets and JWT signing for tokens.
|
|
59
|
+
|
|
60
|
+
## Key Imports
|
|
61
|
+
|
|
62
|
+
```ts
|
|
63
|
+
import { HashProvider, Hash } from '@rudderjs/hash'
|
|
64
|
+
|
|
65
|
+
import type { HashConfig } from '@rudderjs/hash'
|
|
66
|
+
```
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rudderjs/hash",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.2",
|
|
4
4
|
"rudderjs": {
|
|
5
5
|
"provider": "HashProvider",
|
|
6
6
|
"stage": "infrastructure"
|
|
@@ -12,8 +12,12 @@
|
|
|
12
12
|
"directory": "packages/hash"
|
|
13
13
|
},
|
|
14
14
|
"type": "module",
|
|
15
|
+
"engines": {
|
|
16
|
+
"node": "^20.19.0 || >=22.12.0"
|
|
17
|
+
},
|
|
15
18
|
"files": [
|
|
16
|
-
"dist"
|
|
19
|
+
"dist",
|
|
20
|
+
"boost"
|
|
17
21
|
],
|
|
18
22
|
"main": "./dist/index.js",
|
|
19
23
|
"types": "./dist/index.d.ts",
|
|
@@ -25,7 +29,7 @@
|
|
|
25
29
|
},
|
|
26
30
|
"dependencies": {
|
|
27
31
|
"bcryptjs": "^2.4.3",
|
|
28
|
-
"@rudderjs/core": "^1.
|
|
32
|
+
"@rudderjs/core": "^1.1.5"
|
|
29
33
|
},
|
|
30
34
|
"optionalDependencies": {
|
|
31
35
|
"argon2": "^0.41.0"
|