Programming API
Web Crypto
The Web Crypto API provides a set of low-level functions for common cryptographic tasks. The Workers Runtime implements the full surface of this API, but with some differences in the supported algorithms compared to those implemented in most browsers.
Performing cryptographic operations using the Web Crypto API is significantly faster than performing them purely in JavaScript. If you want to perform CPU-intensive cryptographic operations, you should consider using the Web Crypto API.
The Web Crypto API is implemented through the SubtleCrypto
interface,
accessible via the global crypto.subtle
binding. A simple example of
calculating a digest (also known as a hash) is:
Caution
The Web Crypto API differs significantly from Node’s Crypto API. If you want to port JavaScript code that relies on Node’s Crypto API, you will need to adapt it to use Web Crypto primitives.
Methods#
Crypto.getRandomValues()
#
The Crypto.getRandomValues()
method lets you get cryptographically strong
random values.
Refer to the MDN documentation for more information
Crypto.randomUUID()
#
Generates a v4 UUID using a cryptographically secure random number generator.
Refer to the MDN documentation for more information
HMAC Signatures#
The following code blocks show how to sign and verify a string using HMAC.
Sign a Value#
Verify a Value#
Supported algorithms#
The runtime implements all operations of the WebCrypto standard, as shown in the following table.
A checkmark (✓) indicates that this feature is believed to be fully supported according to the spec.
An x (✘) indicates that this feature is part of the specification but not implemented.
If a feature only implements the operation partially, details are listed.
Algorithm | sign() verify() | encrypt() decrypt() | digest() | deriveBits() deriveKey() | generateKey() | wrapKey() unwrapKey() | exportKey() | importKey() |
---|---|---|---|---|---|---|---|---|
RSASSA PKCS1 v1.5 | ✓ | ✓ | ✓ | ✓ | ||||
RSA PSS | ✓ | ✓ | ✓ | ✓ | ||||
RSA OAEP | ✓ | ✓ | ✓ | ✓ | ✓ | |||
ECDSA | ✓ | ✓ | ✓ | ✓ | ||||
ECDH | ✓ | ✓ | ✓ | ✓ | ||||
Ed255191 | ✓ | ✓ | ✓ | ✓ | ||||
X255191 | ✓ | ✓ | ✓ | ✓ | ||||
NODE ED255192 | ✓ | ✓ | ✓ | ✓ | ||||
AES CTR | ✓ | ✓ | ✓ | ✓ | ✓ | |||
AES CBC | ✓ | ✓ | ✓ | ✓ | ✓ | |||
AES GCM | ✓ | ✓ | ✓ | ✓ | ✓ | |||
AES KW | ✓ | ✓ | ✓ | ✓ | ||||
HMAC | ✓ | ✓ | ✓ | ✓ | ||||
SHA 1 | ✓ | |||||||
SHA 256 | ✓ | |||||||
SHA 384 | ✓ | |||||||
SHA 512 | ✓ | |||||||
MD53 | ✓ | |||||||
HKDF | ✓ | ✓ | ||||||
PBKDF2 | ✓ | ✓ |
Footnotes:
-
Algorithms as specified in the Secure Curves API.
-
Legacy non-standard EdDSA is supported for the Ed25519 curve in addition to the Secure Curves version. Since this algorithm is non-standard, note the following while using it:
- Use
NODE-ED25519
as the algorithm andnamedCurve
parameters. - Unlike NodeJS, Cloudflare will not support raw import of private keys.
- The algorithm implementation may change over time. While Cloudflare cannot guarantee it at this time, Cloudflare will strive to maintain backward compatibility and compatibility with NodeJS's behavior. Any notable compatibility notes will be communicated in release notes and via this developer documentation.
- Use
-
MD5 is not part of the WebCrypto standard but is supported in Cloudflare Workers for interacting with legacy systems that require MD5. MD5 is considered a weak algorithm. Do not rely upon MD5 for security.