[PATCH] Use secrets and fall back to random.SystemRandom for keys
Jeremy Cline
jcline at redhat.com
Thu Oct 10 10:08:13 AEDT 2019
On Thu, Oct 10, 2019 at 09:30:50AM +1100, Daniel Axtens wrote:
> Hi Jeremy,
>
> > The random module uses the Mersenne Twister pseudorandom number
> > generator and is not a cryptographically secure random number
> > generator[0]. The secrets[1] module is intended for generating
> > cryptographically strong random numbers, so recommend using that to
> > generate the secret key. It's new in Python 3, so if it's unavailable
> > fall back to using the ``os.urandom()`` backed implementation of random.
> >
> > [0] https://docs.python.org/3/library/random.html
> > [1] https://docs.python.org/3/library/secrets.html
> >
>
> Thanks for your patch.
>
> I agree that correctly generated randomness is the right way to go.
>
> Do you think we need to advise existing implementations to roll their
> secret? My feeling is that given the way the twister has been seeded
> since Python 2.4 (os.urandom if available), existing installations are
> probably OK, but I'd be interested in your take.
>
If I were running the service I would, but I do agree that given it's
likely it was seeded with os.urandom existing installations are probably
fine.
> > Signed-off-by: Jeremy Cline <jcline at redhat.com>
> > ---
> > docs/deployment/installation.rst | 10 ++++++++--
> > patchwork/settings/production.example.py | 12 +++++++++---
> > ...andom.SystemRandom-for-keys-9ceb496919a1bb6f.yaml | 5 +++++
> > 3 files changed, 22 insertions(+), 5 deletions(-)
> > create mode 100644 releasenotes/notes/use-secrets-and-fall-back-to-random.SystemRandom-for-keys-9ceb496919a1bb6f.yaml
> >
> > diff --git a/docs/deployment/installation.rst b/docs/deployment/installation.rst
> > index d422573..f477a11 100644
> > --- a/docs/deployment/installation.rst
> > +++ b/docs/deployment/installation.rst
> > @@ -254,9 +254,15 @@ This should be a random value and kept secret. You can generate and a value for
> >
> > .. code-block:: python
> >
> > - import string, random
> > + import string
> > + try:
> > + import secrets
> > + except ImportError: # Python < 3.6
> > + import random
> > + secrets = random.SystemRandom()
>
> We're dropping Python 2 soon, not in the next version coming out Real
> Soon Now, but in the version after that. Would it be worth holding this
> patch until then so as we can avoid this messy try:import? I have a
> topic branch for this and I'd be happy to include this patch in it.
>
An alternate approach here would be to just not use the secrets API.
CPython is just proxying the calls to secrets.choice to
random.SystemRandom().choice() so it comes to the same thing. I just
prefer the secrets API since its promise is to be fit for cryptographic
purposes and if they find a bug they'll fix it.
In my own projects I prefer to use the newer APIs when possible and fall
back as I don't find the clean-up to be terribly difficult (I just grep
for ImportErrors), but I do get that it's ugly. I don't have a strong
opinion about doing just random.SystemRandom().choice(), just
secrets.choice() in a deferred branch, or this, so I'll leave it up to
you.
Thanks,
Jeremy
More information about the Patchwork
mailing list