blob: 40f1a3c85e76b546cf4aeb249df90d22afaaa729 [file] [log] [blame]
Alex Gaynore9083292013-12-17 16:56:29 -08001Fernet (Symmetric encryption)
2=============================
Alex Gaynor333fb102013-10-31 10:27:35 -07003
4.. currentmodule:: cryptography.fernet
5
Alex Gaynor681fca82013-12-31 14:13:39 -08006Fernet provides guarantees that a message encrypted using it cannot be
7manipulated or read without the key. `Fernet`_ is an implementation of
8symmetric (also known as "secret key") authenticated cryptography.
Alex Gaynor333fb102013-10-31 10:27:35 -07009
10.. class:: Fernet(key)
11
12 This class provides both encryption and decryption facilities.
13
14 .. doctest::
15
16 >>> from cryptography.fernet import Fernet
Alex Gaynor36597b42013-11-22 10:25:13 -080017 >>> key = Fernet.generate_key()
Alex Gaynor333fb102013-10-31 10:27:35 -070018 >>> f = Fernet(key)
Alex Gaynor0d089632013-12-17 20:23:43 -080019 >>> token = f.encrypt(b"my deep dark secret")
20 >>> token
Alex Gaynorde475eb2013-10-31 10:35:19 -070021 '...'
Alex Gaynor0d089632013-12-17 20:23:43 -080022 >>> f.decrypt(token)
Alex Gaynor333fb102013-10-31 10:27:35 -070023 'my deep dark secret'
24
Alex Gaynor7a121fc2013-11-22 10:18:30 -080025 :param bytes key: A URL-safe base64-encoded 32-byte key. This **must** be
26 kept secret. Anyone with this key is able to create and
27 read messages.
Alex Gaynor333fb102013-10-31 10:27:35 -070028
Alex Gaynor36597b42013-11-22 10:25:13 -080029 .. classmethod:: generate_key()
30
31 Generates a fresh fernet key. Keep this some place safe! If you lose it
32 you'll no longer be able to decrypt messages; if anyone else gains
Alex Gaynor6cf242b2013-12-16 11:17:07 -080033 access to it, they'll be able to decrypt all of your messages, and
Alex Stapleton63b3de22014-02-08 09:43:16 +000034 they'll also be able forge arbitrary messages that will be
Alex Gaynor6cf242b2013-12-16 11:17:07 -080035 authenticated and decrypted.
Alex Gaynor333fb102013-10-31 10:27:35 -070036
37 .. method:: encrypt(plaintext)
38
39 :param bytes plaintext: The message you would like to encrypt.
Alex Stapleton63b3de22014-02-08 09:43:16 +000040 :returns bytes: A secure message that cannot be read or altered
Alex Gaynor0d089632013-12-17 20:23:43 -080041 without the key. It is URL-safe base64-encoded. This is
Alex Gaynor3aa243c2014-01-06 13:13:18 -080042 referred to as a "Fernet token".
Alex Gaynor32dc4e42013-12-20 13:26:12 -080043
Alex Gaynor719eb6a2013-12-20 13:35:57 -080044 .. note::
Alex Gaynor32dc4e42013-12-20 13:26:12 -080045
46 The encrypted message contains the current time when it was
47 generated in *plaintext*, the time a message was created will
48 therefore be visible to a possible attacker.
Alex Gaynor333fb102013-10-31 10:27:35 -070049
Alex Gaynor0d089632013-12-17 20:23:43 -080050 .. method:: decrypt(token, ttl=None)
Alex Gaynor333fb102013-10-31 10:27:35 -070051
Alex Gaynor0d089632013-12-17 20:23:43 -080052 :param bytes token: The Fernet token. This is the result of calling
53 :meth:`encrypt`.
Alex Gaynor333fb102013-10-31 10:27:35 -070054 :param int ttl: Optionally, the number of seconds old a message may be
55 for it to be valid. If the message is older than
56 ``ttl`` seconds (from the time it was originally
Alex Gaynor13e0d542013-10-31 10:38:04 -070057 created) an exception will be raised. If ``ttl`` is not
58 provided (or is ``None``), the age of the message is
59 not considered.
Alex Gaynor333fb102013-10-31 10:27:35 -070060 :returns bytes: The original plaintext.
Alex Gaynor719eb6a2013-12-20 13:35:57 -080061 :raises cryptography.fernet.InvalidToken: If the ``token`` is in any
62 way invalid, this exception
63 is raised. A token may be
64 invalid for a number of
65 reasons: it is older than the
66 ``ttl``, it is malformed, or
67 it does not have a valid
68 signature.
Alex Gaynor7a121fc2013-11-22 10:18:30 -080069
70
71.. class:: InvalidToken
72
73 See :meth:`Fernet.decrypt` for more information.
Alex Gaynor333fb102013-10-31 10:27:35 -070074
Alex Gaynorb32b4912014-01-23 16:24:13 -060075Implementation
76--------------
77
78Fernet is built on top of a number of standard cryptographic primitives.
79Specifically it uses:
80
81* :class:`~cryptography.hazmat.primitives.ciphers.algorithms.AES` in
82 :class:`~cryptography.hazmat.primitives.ciphers.modes.CBC` mode with a
83 128-bit key for encryption; using
84 :class:`~cryptography.hazmat.primitives.ciphers.PKCS7` padding.
85* :class:`~cryptography.hazmat.primitives.hmac.HMAC` using
86 :class:`~cryptography.hazmat.primitives.hashes.SHA256` for authentication.
87* Initialization vectors are generated using ``os.urandom()``.
88
89For complete details consult the `specification`_.
90
Alex Gaynor333fb102013-10-31 10:27:35 -070091
92.. _`Fernet`: https://github.com/fernet/spec/
Alex Gaynorb32b4912014-01-23 16:24:13 -060093.. _`specification`: https://github.com/fernet/spec/blob/master/Spec.md