【发布时间】:2019-10-01 05:18:09
【问题描述】:
在大多数情况下,我需要使用密码加密字符串,然后将其发送/保存到某处。稍后我想用密码解密它。我没有加密核导弹代码或医疗病人数据!理想的情况是 2 个功能:
string Encrypt(string plainText, string password);
string Decrypt(string cipherText, string password);
我看过crypto documentation...哦,天哪!所以我尝试自己编写上述调用 (see a proof of concept using AES Managed and Base64 encoded payload)。我不是加密专家,为什么我必须编码?我可能做错了什么......
- 要从密码中派生密钥,接口需要盐。我可以将密码用作盐吗?我可以重复使用静脉输液作为盐吗?也许不是,但我不想添加其他参数。
- 我可以使用固定静脉输液吗?相同的明文和密码应该会产生不同的密文,所以我必须在有效载荷中提供 IV 进行解密。
- 我可以使用盐作为密钥并保持 IV 不变吗?感觉不对。
- 创建一个 nonce 并从中派生 IV 和 key salt 是一种有效的方法吗?
- 如果 .Net 支持 GCM 模式,我还会遇到这个问题吗?
【问题讨论】:
-
完全有效的问题。这些 API 将非常有用,我认为它们应该存在。加密 API 感觉有点讨厌。 1.0 中的不同 .NET API 由不同的团队完成。大多数都非常好,但框架的某些区域不是。你可以在 GitHub 的 corefx 存储库中提出这个建议。
-
@MarcGravell 固有的复杂性相当有限。例如,您可以使用 AES-GCM 制作一个非常安全且通用的经过身份验证的加密原语。一个电话
byte[] Encrypt(byte[] data, byte[] key, byte[] authTag)就足够了。用户仍然必须了解一些事情,但误用的可能性相当有限。 .NET 框架没有理由让事情变得如此困难。 -
@MarcGravell 和类似的库旨在创建难以误用的原语并具有 非常 简单的 API。 .NET 中的加密具有很多人为的复杂性。就像 ADO.NET 一样,大部分时间你都需要 EF 或 Dapper。想要执行查询?来电查询。不打开和配置大量对象并通过阅读器运行。
-
@usr 同意,我听到了;也许您的 ADO.NET 比较是一个很好的比较,这里是必要的复杂性与不必要的复杂性;失分;但是(旁白)......我认为你不能相信那些 Dapper 的人......
-
您可能对此(免责声明,由我编写)repository 感兴趣,它包含的方法与您用 14 种不同语言(包括 C#)概述的方法完全相同。
标签: c# .net cryptography aes