node-easy-crypto
![Dev depedencies](https://david-dm.org/emartech/node-easy-crypto/dev-status.svg)
Provides simple wrappers around Node's crypto implementation.
Usage
To get started just require the lib and create an instance right away.
let crypto = require('crypto');
let ecrypto = require('@emartech/easy-crypto')();
let password = crypto.randomBytes(24).toString('hex');
let randomData = crypto.randomBytes(1024).toString('hex');
let encrypted = yield ecrypto.encryptAsync(password, randomData);
let decrypted = yield ecrypto.decryptAsync(password, encrypted);
randomData === decrypted;
Interface
Initialization
There aren't too many options you can change and that's on purpose. This small wrapper library is secure by default. You can change two configurations: passwordSaltSize
, iterationCount
by passing them to the initialization function as follows:
let ecrypto = require('easy-crypto')(12, 10000);
The default value for passwordSaltSize
is 12 bytes
, for iterationCount
it is 10k iterations
.
passwordSaltSize
The size of the random data used to generate the encryption key. This value is in bytes
.
iterationCount
The iteration count used to generate the encryption key.
encryptAsync(password
, plaintext
) -> ciphertext
password
should be any normal string. It will be used to generate the encryption key. plaintext
must be utf-8
encoded string. It will be "converted" to bytes
and those will be used for the cryptographic operations. The output of this operations is base64
encoded buffers. This will be used as the input of the decryptAsync
operation.
decryptAsync(password
, ciphertext
) -> plaintext
password
should be any normal string. It will be used to generate the encryption key. ciphertext
must be the output of the encryptAsync
method. The library is not compatible with any other encryption library out of the box! The output of this operation is the original utf-8
encoded string.
The crypto parts
The library is only a thin wrapper of node's own crypto
module. It uses well known and battle tested encryption techniques. It provides a convenient wrapper around these functions, taking away the details of using encryption correctly. Feel free to explore the source!
Encryption process
- It generates random bytes for later operations
passwordSaltSize
random bytes
are used to create the 256 bit
long encryption key from the password
using pbkdf2
and the given iteration count
- The
plaintext
is encrypted using aes-256-gcm
with the generated key and a 12 bytes
long random initialization vector
, this operation also yields a 16 bytes
long authentication tag
, which can be used to verify the encrypted data's integrity - It concatenates the following data to into a buffer:
passwordSalt bytes
, initialization vector bytes
, ciphertext bytes
, authentication tag bytes
- It encodes the whole buffer using
base64
and returns it
Decryption process
- It decodes the
base64
input to bytes - It slices this data into:
passwordSalt bytes
, initialization vector bytes
, ciphertext bytes
, authentication tag bytes
- The
passwordSalt bytes
and the password
are used to generate the 256 bit
long encryption key using pbkdf2
and the given iteration count
- The
ciphertext bytes
are decrypted using aes-256-gcm
with the generated key the initialization vector bytes
. During encryption the integrity of the date is also verified using the authentication tag bytes
- It encodes the decrypted buffer using
utf-8
and returns it
Please find us, we would love your feedback!