【发布时间】:2019-01-04 02:42:35
【问题描述】:
我需要一个加密随机字符串作为我的 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,以及来自 0X 前缀的潜在 X ) 将出现在结果字符串中。如何通过利用更多的关键空间来改进当前的方法?
转换应该尽可能高效,但另一方面我希望保留大部分随机性。请注意,如果该操作过于膨胀,我不希望保留所有熵。相反,我在结果字符串的长度、性能和熵之间寻求平衡。
我已经在我的项目中将libsodium 用于其他功能,我想坚持下去。除非您有充分的理由,否则请避免推荐其他库。
【问题讨论】:
-
字符串的期望约束是什么?可打印?你考虑过base64
-
@dvhh 除了必须存储在 HTTP cookie 中之外,没有其他要求,base64 看起来是一个有效的选项!您可以将其作为答案,我会投票并接受它。
-
您确定限制密钥空间吗?密钥是 32 个字节,表示为 64 个十六进制数字。使用 Base64 编码可能会减少到 43 个字符,但密钥的随机性完全不受影响。它仍然是您正在编码的 256 位。
-
@Gerhardh 是的,我明白这一点,我的问题中可能存在一些措辞问题。我想说的是,通过使用更多的字母数字字符,我可以用更短的字符串获得相同的随机性,通过网络传递并存储在客户端中,这是可取的。
标签: c string random cryptography byte