From ddd16210e48a58fc493e2aebbe235adc3ad9aa76 Mon Sep 17 00:00:00 2001 From: Luke Ratcliffe Date: Thu, 23 Apr 2026 08:46:51 +0000 Subject: [PATCH 1/3] Mark non-security md5 usage to allow for compatibility with fips environments --- cassandra/metadata.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/cassandra/metadata.py b/cassandra/metadata.py index 0b403bc324..0001778f5e 100644 --- a/cassandra/metadata.py +++ b/cassandra/metadata.py @@ -19,7 +19,7 @@ from collections import defaultdict from collections.abc import Mapping from functools import total_ordering -from hashlib import md5 +import hashlib import json import logging import re @@ -1864,7 +1864,7 @@ class MD5Token(HashToken): def hash_fn(cls, key): if isinstance(key, str): key = key.encode('UTF-8') - return abs(varint_unpack(md5(key).digest())) + return abs(varint_unpack(hashlib.md5(key,usedforsecurity=False).digest())) class BytesToken(Token): From 002bf5c4c367bf77024d811193d3c1e7788e768e Mon Sep 17 00:00:00 2001 From: Luke Ratcliffe Date: Fri, 1 May 2026 10:33:21 +0100 Subject: [PATCH 2/3] Style fix in cassandra/metadata.py Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> --- cassandra/metadata.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cassandra/metadata.py b/cassandra/metadata.py index 0001778f5e..269c5e424b 100644 --- a/cassandra/metadata.py +++ b/cassandra/metadata.py @@ -1864,7 +1864,7 @@ class MD5Token(HashToken): def hash_fn(cls, key): if isinstance(key, str): key = key.encode('UTF-8') - return abs(varint_unpack(hashlib.md5(key,usedforsecurity=False).digest())) + return abs(varint_unpack(hashlib.md5(key, usedforsecurity=False).digest())) class BytesToken(Token): From d77aae4149b59c85733c9986b822a584ca83f3ee Mon Sep 17 00:00:00 2001 From: Luke Ratcliffe Date: Fri, 1 May 2026 10:16:21 +0000 Subject: [PATCH 3/3] Only use md5 if it is available --- cassandra/metadata.py | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/cassandra/metadata.py b/cassandra/metadata.py index 269c5e424b..906c3a73e5 100644 --- a/cassandra/metadata.py +++ b/cassandra/metadata.py @@ -19,7 +19,6 @@ from collections import defaultdict from collections.abc import Mapping from functools import total_ordering -import hashlib import json import logging import re @@ -28,6 +27,12 @@ import struct import random +md5 = None +try: + from hashlib import md5 +except ImportError as e: + pass + murmur3 = None try: from cassandra.murmur3 import murmur3 @@ -1827,6 +1832,8 @@ def __repr__(self): class NoMurmur3(Exception): pass +class NoMD5(Exception): + pass class HashToken(Token): @@ -1862,9 +1869,11 @@ class MD5Token(HashToken): @classmethod def hash_fn(cls, key): + if md5 is None: + raise NoMD5() if isinstance(key, str): key = key.encode('UTF-8') - return abs(varint_unpack(hashlib.md5(key, usedforsecurity=False).digest())) + return abs(varint_unpack(md5(key).digest())) class BytesToken(Token):