有效地将随机字节转换为字符串,而不会造成熵的损失

时间:2018-07-27 02:48:25

标签: c string random cryptography byte

我需要一个密码随机的字符串作为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-9A-E和潜在的X 0X前缀中的字符串)将出现在结果字符串中。如何通过利用更多的密钥空间来改进当前方法?

转换应尽可能高效,但另一方面,我希望保留大多数随机性。请注意,如果该操作过于扩展,我不希望保留所有熵。相反,我正在寻找结果字符串的长度,性能和熵值之间的平衡。

我已经在项目中使用libsodium来实现其他功能,我想坚持下去。除非您有充分的理由,否则请避免建议其他库。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

从大小的角度来看,最好的编码是Base85 encoding,甚至优于base64。