【问题标题】:Is it safe to use Rijndael.Create() instead of new RijndaelManaged()使用 Rijndael.Create() 而不是 new RijndaelManaged() 是否安全
【发布时间】:2011-01-13 00:14:50
【问题描述】:

我已经阅读了一些关于这个主题的文章,但我仍然对我看到的答案不是 100% 满意。

当您使用 Rijndael.Create() 创建加密算法时,您会得到一个类型为 RijndaelManaged 的对象 - 这与调用 new RijndaelManaged()(或 New RijndaelManaged() 对于你们 VB 的人)之间似乎没有区别. :)

根据我的阅读,Rijndael.Create() 方法存在,因此您无需担心具体实现,以防它在未来版本中发生变化。但我的问题是:假设确实发生了这种情况,并且 .NET 5.0 返回了不同的实现。是否可以保证使用 RijndaelManaged 加密的项目可以使用SomeFutureRijndaelManaged 毫无问题地解密?

我无法想象它们会不兼容,但我只是想确认一下。

谢谢

【问题讨论】:

  • 关于 VB 注意:VB 不区分大小写,因此 C# 构造函数调用将像在 VB 中一样工作。只是IDE坚持一切都大写。
  • 是的,我知道...只是个坏笑话。

标签: .net cryptography rijndaelmanaged rijndael


【解决方案1】:

Rijndael.Create 添加了一个抽象层和额外的重定向,以便可以提供系统特定版本的算法。实际上它非常慢,需要通过 Crypto API 来解析 OID 字符串映射,最终到达RijndaelManaged 类。我们发现,它不会提供跨平台的稳定性,而是会导致跨 Windows 2000/XP/Vista/Windows 的问题。此外,通过 Create 方法创建对象实例比直接实例化 RijndaelManaged 类要慢数百倍。在加密/解密内存中的数据时,我们发现这是一个主要瓶颈。

就“面向未来”而言 - 安全算法没有这样的东西。当 .NET 5.0 出来时。无论您创建算法的方法如何,您都必须更新以适应他们所做的任何更改。您可以在应用程序的 .config 文件中使用 <supportedRuntime /> 来锁定 .NET 版本,这样您就只允许您的应用程序在测试和更新后切换。

【讨论】:

  • 谢谢。我想我会直接使用 RijndaelManaged,我会研究一下 supportedRuntime 设置。
猜你喜欢
  • 2012-10-14
  • 2012-07-26
  • 2014-06-15
  • 1970-01-01
  • 2012-10-03
  • 2019-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多