使用ProtoBuf时,最好的加密方法是什么?

15

我已经将手机设备中的数据库从VistaDB迁移到了ProtoBuf,因为它速度太慢了。现在我使用ProtoBuf创建一系列存储卡上的平面文件,唯一的问题是显然没有加密。

哪种加密方法最适合于ProtoBuf?我基本上会将数据实体的集合序列化到文件中,然后从文件反序列化回到我的集合中。我想把加密放在读/写的FileStream中应该是最好的地方。

这些数据将包含NI号码、姓名和地址,因此必须确保安全。有任何想法吗?


3
我其实不知道答案,但因为使用了“whilst”这个词而点赞! - Adam Paynter
1
我为出色的英语表达鼓掌。虽然“whilst”应该是常识,但我仍然欣赏看到它被使用。我知道,有点挑剔... :) - Adam Paynter
3个回答

4

我认为你走在了正确的轨道上。你应该可以做到像这样:

ICryptoTransform encryptor = ...
Stream encStream = new CryptoStream(outputFileStream, encryptor, CryptoStreamMode.Write);
Serializer.Serialize(encStream, obj);
encStream.FlushFinalBlock()
encStream.Close();

ICryptoTransform decryptor = ...
Stream decStream = new CryptoStream(inputputFileStream, decryptor, CryptoStreamMode.Read);
Serializer.Deserialize<Type>(decStream);
decStream.FlushFinalBlock()
decStream.Close();

关于.NET的加密框架基础知识(包括如何获取ICryptoTransform对象),请查看其他类似问题,例如在.NET中加密短字符串的最佳方法是什么?


很明显,对于重复的问题我们深感抱歉。这是由于 Stack Overflow 的一个 bug 引起的。 - Matthew Flaschen

2
另一种选择是通过安装系统范围的文件系统过滤器来实际加密存储数据的整个文件夹。这里的优点是:
  1. 您的应用程序代码对加密是不可知的,加密将在本地代码中完成。
  2. 由于加密是在本地代码中完成的,因此速度会更快。
  3. 由于加密不在托管代码内部,因此更难逆向工程并找出您的密钥、盐等。
当然,缺点(对于那些不编写C#的人)是您无法使用C#编写它。

我不知道本地代码会快多少。这可能取决于涉及的数据量。我也不认为托管代码会使密钥更加明显。无论哪种方式,密钥应该在内存中短暂存在(可能对调试器可见),并且永远不会存储在磁盘上。 - Matthew Flaschen
什么是使用密钥的最佳方式?我需要知道密钥,以便在服务器和客户端上加密/解密数据。这意味着双方都需要知道密钥,而且我需要能够将存储数据的卡片随时放入新的PDA中并仍然能够查看数据。在源代码中存储密钥是不好的做法吗? - djdd87
是的,在硬盘上(包括源代码中)存储密钥(未加密)意味着它基本上立即被破解。这就是为什么DRM方案最终总是会被攻破的原因。 - Matthew Flaschen
使用Reflector反编译托管代码,让初级“黑客”很容易找到关键信息。如果关键信息被嵌入在本地字节码中,那么需要更多的技能才能进行反汇编和查找。 - ctacke

0
如果您关心密钥的保密性,请使用基于密码的方法,并多次对手动输入的密码进行哈希处理以生成密钥。

如果您的建议特别针对ProtoBuf,那么呢? - David Collins

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接