我需要一个密码随机的字符串作为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());
结果字符串示例如下:
36b95095192b4b3999804c95605aee06bd3381e4197cdfa5230a37425a863d40
我认为这是最明显的方法。这个问题是大多数键空间都没有使用:即使忽略大小写,也有36个字母数字字符,但是只有16个(0-9
,A-E
和潜在的X
0X
前缀中的字符串)将出现在结果字符串中。如何通过利用更多的密钥空间来改进当前方法?
转换应尽可能高效,但另一方面,我希望保留大多数随机性。请注意,如果该操作过于扩展,我不希望保留所有熵。相反,我正在寻找结果字符串的长度,性能和熵值之间的平衡。
我已经在项目中使用libsodium
来实现其他功能,我想坚持下去。除非您有充分的理由,否则请避免建议其他库。
答案 0 :(得分:2)
正如评论和事件中提到的那样,考虑到您的约束(存储在HTTP cookie中),似乎Base64是最好的解决方案。
答案 1 :(得分:2)
从大小的角度来看,最好的编码是Base85 encoding,甚至优于base64。