blob: 13295c0c9171d88393032896dacf4ffb6c154201 [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
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 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
75
76.. _`Fernet`: https://github.com/fernet/spec/