Skip to content

Commit 949248d

Browse files
miss-islingtonLamentXU123picnixz
authored
[3.14] gh-135244: generate UUID random Node ID with a CSPRNG as per RFC 9562, §6.10.3 (GH-135226) (#135255)
gh-135244: generate UUID random Node ID with a CSPRNG as per RFC 9562, §6.10.3 (GH-135226) This aligns with the recommendations of RFC 9562, Section 6.10, paragraph 3 [1]. [1]: https://www.rfc-editor.org/rfc/rfc9562.html#section-6.10-3. --------- (cherry picked from commit 1cb7163) Co-authored-by: LamentXU <108666168+LamentXU123@users.noreply.github.com> Co-authored-by: Bénédikt Tran <10796600+picnixz@users.noreply.github.com>
1 parent 85efa77 commit 949248d

File tree

3 files changed

+16
-6
lines changed

3 files changed

+16
-6
lines changed

Doc/library/uuid.rst

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -257,6 +257,10 @@ The :mod:`uuid` module defines the following functions:
257257
non-specified arguments are substituted for a pseudo-random integer of
258258
appropriate size.
259259

260+
By default, *a*, *b* and *c* are generated by a non-cryptographically
261+
secure pseudo-random number generator (CSPRNG). Use :func:`uuid4` when
262+
a UUID needs to be used in a security-sensitive context.
263+
260264
.. versionadded:: 3.14
261265

262266

Lib/uuid.py

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -656,18 +656,20 @@ def _windll_getnode():
656656

657657
def _random_getnode():
658658
"""Get a random node ID."""
659-
# RFC 4122, $4.1.6 says "For systems with no IEEE address, a randomly or
660-
# pseudo-randomly generated value may be used; see Section 4.5. The
661-
# multicast bit must be set in such addresses, in order that they will
662-
# never conflict with addresses obtained from network cards."
659+
# RFC 9562, §6.10-3 says that
660+
#
661+
# Implementations MAY elect to obtain a 48-bit cryptographic-quality
662+
# random number as per Section 6.9 to use as the Node ID. [...] [and]
663+
# implementations MUST set the least significant bit of the first octet
664+
# of the Node ID to 1. This bit is the unicast or multicast bit, which
665+
# will never be set in IEEE 802 addresses obtained from network cards.
663666
#
664667
# The "multicast bit" of a MAC address is defined to be "the least
665668
# significant bit of the first octet". This works out to be the 41st bit
666669
# counting from 1 being the least significant bit, or 1<<40.
667670
#
668671
# See https://en.wikipedia.org/w/index.php?title=MAC_address&oldid=1128764812#Universal_vs._local_(U/L_bit)
669-
import random
670-
return random.getrandbits(48) | (1 << 40)
672+
return int.from_bytes(os.urandom(6)) | (1 << 40)
671673

672674

673675
# _OS_GETTERS, when known, are targeted for a specific OS or platform.
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
:mod:`uuid`: when the MAC address cannot be determined, the 48-bit node
2+
ID is now generated with a cryptographically-secure pseudo-random number
3+
generator (CSPRNG) as per :rfc:`RFC 9562, §6.10.3 <9562#section-6.10-3>`.
4+
This affects :func:`~uuid.uuid1` and :func:`~uuid.uuid6`.

0 commit comments

Comments
 (0)
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy