如何混淆UUID v7的时间戳,同时保留数据库性能?
UUID7 混淆方案可行性探讨
UUID7是一种时间有序UUID,与UUID4相比有以下优势:
- 作为数据库主键使用时不会降低性能
- 包含创建时间戳,使得类似
created_at的列成为冗余
需要注意的是,当用作外部ID时,UUID7会泄露对象的创建时间。无论这是否真的构成安全风险,我想了解以下方案是否可用于去除时间戳信息(失去时间可排序性),同时保留数据库性能:
- 生成一个秘密UUID4
- 插入新对象时,生成一个新的UUID7,并与秘密UUID进行按位异或操作
- 将结果用作对象的ID(及主键)
Python示例代码
>>> from uuid import uuid4, UUID >>> from uuid_extensions import uuid7, uuid_to_datetime >>> def obfuscate(u1: UUID, u2: UUID) -> UUID: return UUID(bytes=bytes(a ^ b for a, b in zip(u1.bytes, u2.bytes))) >>> secret = uuid4() >>> u1 = uuid7() >>> u2 = uuid7() >>> id1 = obfuscate(u1, secret) >>> id2 = obfuscate(u2, secret) >>> print(f'\n secret= {secret}\n u1 = {u1} --> id1 = {id1}\n u2 = {u2} --> id2 = {id2}') secret = 1bc9e84c-c8d6-47c0-afd3-b78a4333f4bc u1 = 06732e7b-9aad-7e72-8000-6978adc183a5 --> id1 = 1dbac637-527b-39b2-2fd3-def2eef27719 u2 = 06732473-1b2b-7d9a-8000-f7261455e941 --> id2 = 1dbacc3f-d3fd-3a5a-2fd3-40ac57661dfd >>> uuid_to_datetime(u1) datetime.datetime(2024, 11, 12, 5, 29, 29, 667457, tzinfo=datetime.timezone.utc) >>> uuid_to_datetime(id1) is None True
内容的提问来源于stack exchange,提问作者bavaza
相关产品推荐
相关产品推荐

