@justinwwolcott/ez-web-crypto
Version:
class for working with webcrypto in browser and node
252 lines (176 loc) • 7.81 kB
Markdown
# ez-web-crypto

[](https://www.npmjs.com/package/@justinwwolcott/ez-web-crypto)
[](https://opensource.org/licenses/ISC)
[](https://nodejs.org/)
A lightweight, type-safe wrapper around the Web Crypto API, providing easy-to-use cryptographic operations for both browser and Node.js environments.
## Features
- 🔐 AES-GCM encryption/decryption
- 🔑 ECDH key exchange and encryption
- ✍️ ECDSA digital signatures
- 🔒 Password-based encryption
- 🌐 HKDF key derivation
- #️⃣ HMAC operations
- 🧮 Cryptographic hashing (SHA-1, SHA-256, SHA-384, SHA-512)
- 📱 Cross-platform compatibility (Browser + Node.js)
- 📘 Full TypeScript support
- 🔄 Flexible key format handling
## Installation
```bash
npm install @justinwwolcott/ez-web-crypto
```
## Usage Examples
### AES Encryption
```typescript
import { AESMakeKey, AESEncrypt, AESDecrypt } from '@justinwwolcott/ez-web-crypto'
// Generate a new AES key
const key = await AESMakeKey()
// Encrypt data
const encrypted = await AESEncrypt(key, btoa('Hello, World!'))
// Decrypt data
const decrypted = await AESDecrypt(key, encrypted.iv, encrypted.ciphertext, true)
console.log(decrypted) // 'Hello, World!'
```
### ECDH Key Exchange and Encryption
```typescript
import { EcMakeCryptKeys, EcEncrypt, EcDecrypt } from '@justinwwolcott/ez-web-crypto'
// Generate key pairs for both parties
const aliceKeys = await EcMakeCryptKeys()
const bobKeys = await EcMakeCryptKeys()
// Alice encrypts message for Bob
const encrypted = await EcEncrypt(aliceKeys.privateKey, bobKeys.publicKey, btoa('Secret message'))
// Bob decrypts message from Alice
const decrypted = await EcDecrypt(bobKeys.privateKey, aliceKeys.publicKey, encrypted.iv, encrypted.ciphertext, true)
```
### Digital Signatures (ECDSA)
```typescript
import { EcMakeSigKeys, EcSignData, EcVerifySig } from '@justinwwolcott/ez-web-crypto'
// Generate signing keys
const keys = await EcMakeSigKeys()
// Sign data
const signature = await EcSignData(keys.privateKey, btoa('Sign this message'))
// Verify signature
const isValid = await EcVerifySig(keys.publicKey, signature, btoa('Sign this message'))
```
### Password-Based Encryption
```typescript
import { PASSWORD_ENCRYPT, PASSWORD_DECRYPT } from '@justinwwolcott/ez-web-crypto'
// Encrypt with password
const encrypted = await PASSWORD_ENCRYPT('myPassword', btoa('Secret data'))
// Decrypt with password
const decrypted = await PASSWORD_DECRYPT('myPassword', encrypted)
```
### HKDF Encryption
```typescript
import { EcMakeCryptKeys, HKDFEncrypt, HKDFDecrypt } from '@justinwwolcott/ez-web-crypto'
// Generate keys
const aliceKeys = await EcMakeCryptKeys()
const bobKeys = await EcMakeCryptKeys()
// Encrypt using HKDF
const encrypted = await HKDFEncrypt(aliceKeys.privateKey, bobKeys.publicKey, btoa('Secret data'))
// Decrypt using HKDF
const decrypted = await HKDFDecrypt(
bobKeys.privateKey,
aliceKeys.publicKey,
encrypted.salt,
encrypted.iv,
encrypted.ciphertext,
true
)
```
### Hashing and HMAC
```typescript
import { HASH, HMAC } from '@justinwwolcott/ez-web-crypto'
// Generate hash
const hash = await HASH('SHA-256', 'Hash this text')
// Generate HMAC
const hmac = await HMAC('secret-key', 'Message to authenticate')
```
## API Reference
### AES Operations
- `AESMakeKey(exportable?: boolean): Promise<Base64String | CryptoKey>`
- Generates a new AES-GCM key
- `exportable`: Whether the key should be exportable (default: true)
- `AESEncrypt(key: Base64String | CryptoKey, data: Base64String, nonce?: Base64String): Promise<AESEncryptResult>`
- Encrypts data using AES-GCM
- Returns ciphertext and IV
- `AESDecrypt(key: Base64String | CryptoKey, nonce: Base64String, data: Base64String, returnText?: boolean): Promise<string | ArrayBuffer>`
- Decrypts AES-GCM encrypted data
- Optional text return format
### ECDH Operations
- `EcMakeCryptKeys(exportable?: boolean): Promise<ECKeyPair>`
- Generates ECDH key pair for encryption
- Returns public/private keys in multiple formats
- `EcEncrypt(privateKey: Base64String | CryptoKey, publicKey: Base64String | CryptoKey, data: Base64String): Promise<AESEncryptResult>`
- Encrypts data using ECDH key exchange
- Returns encrypted data and IV
- `EcDecrypt(privateKey: Base64String | CryptoKey, publicKey: Base64String | CryptoKey, nonce: Base64String, data: Base64String, returnText?: boolean): Promise<string | ArrayBuffer>`
- Decrypts ECDH encrypted data
### ECDSA Digital Signatures
- `EcMakeSigKeys(exportable?: boolean): Promise<ECSignatureKeyPair>`
- Generates ECDSA signing key pair
- `EcSignData(privateKey: Base64String | CryptoKey, data: Base64String): Promise<Base64String>`
- Signs data using ECDSA
- `EcVerifySig(publicKey: Base64String | CryptoKey, signature: Base64String, data: Base64String): Promise<boolean>`
- Verifies ECDSA signature
### HKDF Operations
- `HKDFEncrypt(privateKey: Base64String | CryptoKey, publicKey: Base64String | CryptoKey, data: Base64String, ivLength?: number, saltLength?: number): Promise<HKDFEncryptResult>`
- Encrypts data using HKDF key derivation
- `HKDFDecrypt(privateKey: Base64String | CryptoKey, publicKey: Base64String | CryptoKey, salt: Base64String, iv: Base64String, data: Base64String, returnText?: boolean): Promise<string | ArrayBuffer>`
- Decrypts HKDF encrypted data
### Password Operations
- `PASSWORD_ENCRYPT(password: string, data: Base64String): Promise<Base64String>`
- Encrypts data using password-based encryption
- `PASSWORD_DECRYPT(password: string, data: Base64String): Promise<string>`
- Decrypts password-protected data
### Hashing Operations
- `HASH(algorithm: HashAlgorithm, data: string, length?: number): Promise<Base64String>`
- Generates cryptographic hash
- Supports SHA-1, SHA-256, SHA-384, SHA-512
- `HMAC(secret: string, data: string): Promise<HexString>`
- Generates HMAC using SHA-256
## Type Definitions
```typescript
type Base64String = string
type HexString = string
type HashAlgorithm = 'SHA-1' | 'SHA-256' | 'SHA-384' | 'SHA-512'
interface AESEncryptResult {
ciphertext: Base64String
iv: Base64String
}
interface HKDFEncryptResult {
ciphertext: Base64String
salt: Base64String
iv: Base64String
}
interface ECKeyPair {
publicKey: Base64String
privateKey: Base64String | CryptoKey
rawPublicKey: Base64String
rawPublicKeyLite: Base64String
jwkPublicKey?: JsonWebKey
jwkPrivateKey?: JsonWebKey
}
```
## Environment Support
- Node.js ≥ 14.0.0
- Modern browsers with Web Crypto API support
- Full TypeScript support included
## Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
1. Fork the repository
2. Create your feature branch (`git checkout -b feature/AmazingFeature`)
3. Commit your changes (`git commit -m 'Add some AmazingFeature'`)
4. Push to the branch (`git push origin feature/AmazingFeature`)
5. Open a Pull Request
## Security Notes
- All cryptographic operations use standard Web Crypto API implementations
- Keys can be handled in both exportable and non-exportable formats
- Password-based encryption uses multiple rounds of hashing for key strengthening
- All operations are async and type-safe
## License
This project is licensed under the ISC License - see the [LICENSE](LICENSE) file for details.
## Author
Justin W. Wolcott
## Support
If you encounter any problems or have questions, please [open an issue](https://github.com/JWally/ez-web-crypto/issues) on GitHub.