我需要一个加密随机字符串作为我的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-9A-E,以及X前缀中的潜在0X)会出现在结果字符串中。如何利用更多的关键空间来改进当前的方法?
转换应该是尽可能有效的,但另一方面,我希望大部分的随机性是保留的。请注意,如果这个操作过于扩展,我不希望保留所有的熵。取而代之的是,我要在结果字符串的长度、性能和熵之间寻求平衡。
我已经在我的项目中使用了libsodium的其他功能,我想坚持使用它。除非你有充分的理由,否则请避免推荐其他图书馆。

最佳答案

正如评论和事件中提到的,考虑到您的约束(存储在HTTP cookie中),似乎Base64是最好的解决方案。

10-07 18:59
查看更多