blob: 2fe2b860f7f1851575469d9622f881302a06f7bd [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 Gaynor333fb102013-10-31 10:27:35 -07006`Fernet`_ is an implementation of symmetric (also known as "secret key")
Alex Gaynor43307c72013-11-21 21:50:14 -08007authenticated cryptography. Fernet provides guarantees that a message encrypted
Alex Gaynor333fb102013-10-31 10:27:35 -07008using it cannot be manipulated or read without the key.
9
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
34 they'll also be able forge arbitrary messages which will be
35 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.
40 :returns bytes: A secure message which 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 Gaynor32dc4e42013-12-20 13:26:12 -080042 refered to as a "Fernet token".
43
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
75
76.. _`Fernet`: https://github.com/fernet/spec/