Skip to content

Commit a3360b1

Browse files
tniessenRafaelGSS
authored andcommitted
doc: emphasize that createCipher is never secure
The current documentation clearly states that createCipher() and createDecipher() should not be used with ciphers in counter mode, but (1) this is an understatement, and (2) these functions are (semantically) insecure for ciphers in any other supported block cipher mode as well. Semantic security requires IND-CPA, but a deterministic cipher with fixed key and IV, such as those generated by these functions, does not fulfill IND-CPA. Are there justified use cases for createCipher() and createDecipher()? Yes and no. The only case in which these functions can be used in a semantically secure manner arises only when the password argument is not actually a password but rather a random or pseudo-random sequence that is unpredictable and that is never reused (e.g., securely derived from a password with a proper salt). Insofar, it is possible to use these APIs without immediately creating a vulnerability. However, - any application that manages to fulfill this requirement should also be able to fulfill the similar requirements of crypto.createCipheriv() and those of crypto.createDecipheriv(), which give much more control over key and initialization vector, and - the MD5-based key derivation step generally does not help and might even reduce the overall security due to its many weaknesses. Refs: #13821 Refs: #19343 Refs: #22089 PR-URL: #44538 Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: Rich Trott <rtrott@gmail.com> Reviewed-By: Mohammed Keyvanzadeh <mohammadkeyvanzade94@gmail.com> Reviewed-By: Filip Skokan <panva.ip@gmail.com>
1 parent a733f7f commit a3360b1

File tree

2 files changed

+10
-2
lines changed

2 files changed

+10
-2
lines changed

doc/api/crypto.md

+8
Original file line numberDiff line numberDiff line change
@@ -3005,6 +3005,10 @@ The `password` is used to derive the cipher key and initialization vector (IV).
30053005
The value must be either a `'latin1'` encoded string, a [`Buffer`][], a
30063006
`TypedArray`, or a `DataView`.
30073007

3008+
<strong class="critical">This function is semantically insecure for all
3009+
supported ciphers and fatally flawed for ciphers in counter mode (such as CTR,
3010+
GCM, or CCM).</strong>
3011+
30083012
The implementation of `crypto.createCipher()` derives keys using the OpenSSL
30093013
function [`EVP_BytesToKey`][] with the digest algorithm set to MD5, one
30103014
iteration, and no salt. The lack of salt allows dictionary attacks as the same
@@ -3124,6 +3128,10 @@ cipher in CCM or OCB mode (e.g. `'aes-128-ccm'`) is used. In that case, the
31243128
authentication tag in bytes, see [CCM mode][].
31253129
For `chacha20-poly1305`, the `authTagLength` option defaults to 16 bytes.
31263130

3131+
<strong class="critical">This function is semantically insecure for all
3132+
supported ciphers and fatally flawed for ciphers in counter mode (such as CTR,
3133+
GCM, or CCM).</strong>
3134+
31273135
The implementation of `crypto.createDecipher()` derives keys using the OpenSSL
31283136
function [`EVP_BytesToKey`][] with the digest algorithm set to MD5, one
31293137
iteration, and no salt. The lack of salt allows dictionary attacks as the same

doc/api/deprecations.md

+2-2
Original file line numberDiff line numberDiff line change
@@ -2114,10 +2114,10 @@ changes:
21142114

21152115
Type: Runtime
21162116

2117-
Using [`crypto.createCipher()`][] and [`crypto.createDecipher()`][] should be
2117+
Using [`crypto.createCipher()`][] and [`crypto.createDecipher()`][] must be
21182118
avoided as they use a weak key derivation function (MD5 with no salt) and static
21192119
initialization vectors. It is recommended to derive a key using
2120-
[`crypto.pbkdf2()`][] or [`crypto.scrypt()`][] and to use
2120+
[`crypto.pbkdf2()`][] or [`crypto.scrypt()`][] with random salts and to use
21212121
[`crypto.createCipheriv()`][] and [`crypto.createDecipheriv()`][] to obtain the
21222122
[`Cipher`][] and [`Decipher`][] objects respectively.
21232123

0 commit comments

Comments
 (0)