crypto (krip-toh); from kruptein
to hide or conceal.
Here you can experiment with the module to ensure it will suit your needs. kruptein
To install npm install kruptein
.set(secret, plaintext, [aad], callback)
.get(secret, ciphertext, [{at: auth_tag, aad: aad}], callback)
Industry standards are used for the algorithm, hashing algorithm, key & IV sizes. The default key derivation is pbkdf2, however use of the scrypt derivation function can be enabled.
algorithm
: (Optional) Cipher algorithm fromcrypto.getCiphers()
. Default:aes-256-gcm
.hashing
: (Optional) Hash algorithm fromcrypto.getHashes()
. Default:sha384
.encodeas
: (Optional) Output encoding. Currently supportsbinary
,hex
, &base64
. Default:base64
.key_size
: (Optional) Key size bytes (should match block size of algorithm). Default:32
iv_size
: (Optional) IV size bytes. Default:16
.at_size
: (Optional) Authentication tag size. Applicable togcm
&ocb
cipher modes. Default:128
.use_scrypt
: (Optional) Use.scrypt()
to derive a key. Requires node > v10. Default/Fallback:.pbkdf2()
.use_asn1
: (Optional) Disable the default ASN.1 encoding. Default: true
When selecting an algorithm from crypto.getCiphers()
the
iv
and key_size
values are calculated auto-magically to make implementation
easy.
You can always define your own if the defaults per algorithm and mode
aren't what you would like; see the options
section above.
An example of creating a new ciphertext object.
const kruptein = require("kruptein")(opts);
let secret = "squirrel";
kruptein.set(secret, "Operation mincemeat was an example of deception", (err, ct) => {
if (err)
throw err;
console.log(ct);
});
An example of retrieveing plaintext from a ciphertext object.
const kruptein = require("kruptein")(opts);
let ciphertext, secret = "squirrel";
kruptein.get(secret, ciphertext, (err, pt) => {
if (err)
throw err;
console.log(pt);
});
The .set()
method output depends on three factors; the encodeas
,
algorithm
and use_asn1
.
For any algorithm that supports authentication (AEAD), the object
structure includes the Authentication Tag
and the Additional Authentication Data
attribute and value.
When the use_asn1
option is enabled (default is true), the result
is an ASN.1
value using the encodeas
value. While this is a more complex
encoding option, it helps standardize & minimize the size of the
resulting ciphertext output.
The included test harness, invoked with npm test
, makes every
attempt to trap and handle errors. Some of which come from side
channel or possible malability of the resultant ciphertext.
This can be seen within the test/index.js
CI test harness under
the HMAC, AT & AAD validation test cases.
An online playgound for experimenting is also available. kruptein
This module conforms to industry recommendations regarding algorithm type, mode, key size, iv size & implementation, digests, key derivation & management etc. References used provided here:
RFC:
- RFC 2104: HMAC: Keyed-Hashing for Message Authentication
- RFC 4086: Randomness Requirements for Security
- RFC 5084: Using AES-CCM and AES-GCM Authenticated Encryption
- RFC 7914: The scrypt Password-Based Key Derivation Function
- RFC 8018: Password-Based Cryptography Specification
- X.697: ASN.1 encoding rules: Specifications of JavaScript Object Notation Encoding Rules (JER)
NIST:
- SP 800-38A: Block cipher modes of operation
- SP 800-38B: Recommendation for Block Cipher Modes of Operation: Galois/Counter Mode (GCM) and GMAC
- SP 800-57P1: Recommendations for key management
- SP 800-107: Recommendation for Applications Using Approved Hash Algorithms
- SP 800-108: Recommendation for Key Derivation Using Pseudorandom Functions
- SP 800-131A: Transitioning the Use of Cryptographic Algorithms and Key Lengths
- SP 800-132: Recommendation for Password-Based Key Derivation
- SP 800-175B: Guideline for Using Cryptographic Standards in the Federal Government
FIPS:
- FIPS 197: Advanced Encryption Standard (AES)
- FIPS 198-1: The Keyed-Hash Message Authentication Code (HMAC)
- FIPS 180-4: Secure Hash Standard (SHS)
Contributions are welcome & appreciated!
Refer to the contributing document to help facilitate pull requests.
This software is licensed under the MIT License.
Copyright Jason Gerfen, 2019.