丹尼尔·维瑞特:将UUID版本7伪装为版本4(或8)

丹尼尔·维瑞特:将UUID版本7伪装为版本4(或8)

💡 原文英文,约1000词,阅读约需4分钟。
📝

内容提要

自RFC-9562发布以来,UUID-v7因其时间顺序特性受到关注,优于随机的UUID-v4。UUID-v7提高了数据库索引效率,但嵌入的时间戳可能存在安全隐患。为保护时间戳,可通过加密将UUID-v7转换为UUID-v4或UUID-v8,此过程在plpgsql中实现,以确保数据安全。

🎯

关键要点

  • 自RFC-9562发布以来,UUID-v7因其时间顺序特性受到关注,优于随机的UUID-v4。
  • UUID-v7提高了数据库索引效率,但嵌入的时间戳可能存在安全隐患。
  • 时间戳可能被用于去匿名化,因此在导出给不可信的第三方时需要保护时间戳。
  • 可以通过加密将UUID-v7转换为UUID-v4,确保数据安全。
  • 实现了UUID-v7到UUID-v4的转换,使用plpgsql编写了两个函数:uuidv7_encrypt和uuidv7_decrypt。
  • 选择XTEA加密方案,时间戳由48位表示,需加密。
  • UUID-v4与UUID-v7结构相似,加密后不易区分。
  • 可以选择将UUID-v7加密为UUID-v8,以区分原生UUID-v4和加密的UUID-v7。
  • plpgsql实现中使用了一些技巧来处理位和字节,简化SQL代码。

延伸问答

UUID-v7相比UUID-v4有什么优势?

UUID-v7因其时间顺序特性,数据库索引效率更高,避免了UUID-v4的随机插入问题。

UUID-v7的时间戳存在哪些安全隐患?

UUID-v7的时间戳可能被用于去匿名化,暴露记录的创建时间。

如何将UUID-v7转换为UUID-v4?

可以通过加密UUID-v7的时间戳,将其转换为UUID-v4,使用plpgsql中的uuidv7_encrypt函数实现。

UUID-v8有什么用途?

UUID-v8用于实验性或特定厂商的用例,可以用来区分加密的UUID-v7和原生UUID-v4。

在plpgsql中如何处理位和字节?

plpgsql中使用了一些技巧,如将UUID转换为二进制字符串和将二进制字符串转换为位向量,以简化SQL代码。

选择XTEA加密方案的原因是什么?

XTEA是一种简单的Feistel密码,适用于64位块,使用128位密钥,适合UUID-v7的加密需求。

➡️

继续阅读