使用Rijndael.Create()而不是新的RijndaelManaged()是否安全

Joe*_*nos 3 .net cryptography rijndael rijndaelmanaged

我已经阅读了一些关于这个主题的内容,但我仍然不能完全理解我看到的答案.

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

根据我的阅读,该Rijndael.Create()方法存在,以便您在将来的版本中更改时不需要担心具体的实现.但我的问题是:假设确实发生了这种情况,.NET 5.0会返回不同的实现.是否可以保证使用RijndaelManaged加密的项目可以解密而不会出现问题SomeFutureRijndaelManaged

我无法想象他们会不相容,但我只是想证实这一点.

谢谢

Pau*_*der 7

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

至于"未来验证" - 安全算法没有这样的东西.当.NET 5.0问世时.无论您创建算法的方法如何,您都必须进行更新以适应他们所做的任何更改.您可以<supportedRuntime />在应用程序的.config文件中使用以锁定.NET版本,这样您只有在测试和更新后才允许应用程序切换.