【问题标题】:Why does RNGCryptoServiceProvider's constructor ignore its parameter?为什么RNGCryptoServiceProvider的构造函数会忽略它的参数?
【发布时间】:2015-08-14 04:22:31
【问题描述】:

我在编码时看到了这个,并认为它看起来很奇怪:

果然,MSDN 表示RNGCryptoServiceProvider(byte[] rgb)RNGCryptoServiceProvider(string str) 都忽略了它们的参数。 据我所知,这两者和RNGCryptoServiceProvider() 之间没有实际区别。到底是怎么回事?我怀疑我遗漏了一些与密码学有关的奇怪东西。

【问题讨论】:

  • 您希望该参数用于什么?
  • @NikBougalis 我会期待两件事之一;参数要么是种子值,要么它们不会提供无用的构造函数。由于这些都不是真的,我很困惑。

标签: c# cryptography


【解决方案1】:

它可能是以前旧版本的遗留物,可能可以追溯到 1.x,因为即使 2.0 API 也包含相同的描述。然而,2.0 和 2.1 API 很可能同时发生了变化。

如果您查看 Mono 源代码,您会发现

_handle = RngInitialize (rgb);

_handle = RngInitialize (Encoding.UTF8.GetBytes (str));

所以我假设数据被用作平台提供的随机数生成器的附加或初始种子。这也是最有意义的。 Mono 源码通常尽可能遵循 MS 实现。

如果提供的 RNG 平台是安全的,则可能几乎不需要从应用程序中播种它。使用 RNG 作为方法来一遍又一遍地生成相同的流(即当参数用作初始种子时)充满危险,尤其是在底层实现未知并且平台和系统更新之间可能不同的情况下。所以这将是弃用构造函数的一个很好的理由。

很明显,如果它们被删除,那么旧的源代码将不再编译。因此,将实现留空更为合乎逻辑,因为生成的实例无论如何都应该生成随机数据。


最后,这只是一个(非常)有根据的猜测,当前的 API 文档中没有说明原因。构造函数似乎也没有标记为过时。换句话说,我对 Microsoft 加密 API 文档的所有期望。

【讨论】:

    猜你喜欢
    • 2017-03-08
    • 2020-04-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-22
    • 1970-01-01
    相关资源
    最近更新 更多