【问题标题】:Efficiently convert random bytes to string without much loss of entropy有效地将随机字节转换为字符串,而不会损失太多熵
【发布时间】: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-9A-E,以及来自 0X 前缀的潜在 X ) 将出现在结果字符串中。如何通过利用更多的关键空间来改进当前的方法?

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

我已经在我的项目中将libsodium 用于其他功能,我想坚持下去。除非您有充分的理由,否则请避免推荐其他库。

【问题讨论】:

  • 字符串的期望约束是什么?可打印?你考虑过base64
  • @dvhh 除了必须存储在 HTTP cookie 中之外,没有其他要求,base64 看起来是一个有效的选项!您可以将其作为答案,我会投票并接受它。
  • 您确定限制密钥空间吗?密钥是 32 个字节,表示为 64 个十六进制数字。使用 Base64 编码可能会减少到 43 个字符,但密钥的随机性完全不受影响。它仍然是您正在编码的 256 位。
  • @Gerhardh 是的,我明白这一点,我的问题中可能存在一些措辞问题。我想说的是,通过使用更多的字母数字字符,我可以用更短的字符串获得相同的随机性,通过网络传递并存储在客户端中,这是可取的。

标签: c string random cryptography byte


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-10-17
      • 2013-04-06
      • 2010-12-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多