我需要一个加密随机字符串作为我的Web应用程序中的会话标识符。以下是我当前使用libsodium
的实现:
char session_id[81];
sprintf(session_id, "%"
PRIx32
"%"
PRIx32
"%"
PRIx32
"%"
PRIx32
"%"
PRIx32
"%"
PRIx32
"%"
PRIx32
"%"
PRIx32,
randombytes_random(), randombytes_random(), randombytes_random(), randombytes_random(),
randombytes_random(), randombytes_random(), randombytes_random(), randombytes_random());
结果字符串的示例如下:
36B95095192B4B399804C95605AEE06BD331E4197CDFA5230A37425A863D40
我认为这是最明显的方式。这个问题是大多数键空间都没有使用:即使忽略大小写敏感度,也有36个字母数字字符,但是只有16个(
0-9
,A-E
,以及X
前缀中的潜在0X
)会出现在结果字符串中。如何利用更多的关键空间来改进当前的方法?转换应该是尽可能有效的,但另一方面,我希望大部分的随机性是保留的。请注意,如果这个操作过于扩展,我不希望保留所有的熵。取而代之的是,我要在结果字符串的长度、性能和熵之间寻求平衡。
我已经在我的项目中使用了
libsodium
的其他功能,我想坚持使用它。除非你有充分的理由,否则请避免推荐其他图书馆。 最佳答案
正如评论和事件中提到的,考虑到您的约束(存储在HTTP cookie中),似乎Base64是最好的解决方案。