正在位级别加密Windows Phone资源..我这样做对吗
本文关键字:资源 这样做 Phone Windows 加密 | 更新日期: 2023-09-27 18:27:47
我有一个关于加密的问题,更具体地说,加密不需要互联网连接(与私钥/公钥或OAuth方法相反)。
当我发现WP7应用商店不安全时,问题就出现了。我不会发布链接,但基本搜索会产生一个桌面应用程序,允许你在市场上下载任何免费的WP7。然后,将.xap重命名为.zip,并使用reflector查看代码。
我相信Dotfuscator会解决我的问题,但作为一次学习经历,我决定想出自己的解决方案。
我决定使用一个程序,在预构建中收集我想要加密的文件,将它们放在一个文件中,加密该文件,并将其添加到项目中进行编译。手机应用程序中的代码只需要解密数据。
我正在加密/解密的数据是几个API密钥(用于大约10个web服务),这意味着在解密时可以作为纯文本读取。
这是我提出的加密算法(大致上,经过一些修改):
public static byte[] SuffleData(byte[] data)
{
// Create a bit array to deal with the data on the bit level
BitArray bits = new BitArray(data);
// Generate a random GUID, and store it in a bit array as well
Guid guid = Guid.NewGuid();
BitArray guidBits = new BitArray(guid.ToByteArray());
int guidBitsIndex = 0;
// Iterate over all the data bit by bit
for (int i = 0; i < bits.Count / 2; i++)
{
// if the current GUID bit is true (1), then swap
// the current bit with it's mirror
if (guidBits[guidBitsIndex])
{
bool temp = bits[i];
bits[i] = bits[bits.Length - i];
bits[bits.Length - i] = temp;
}
// Because the data being shuffled is expected to
// contain more bits than the GUID, this index
// needs to be reset
if (guidBitsIndex == guidBits.Count)
guidBitsIndex = 0;
else
guidBitsIndex++;
}
// HideGuidInData hides the bits for the GUID in a hard
// coded location inside the data being encrypted.
HideGuidInData(ref bits, guidBits);
// Convert the shuffled data bits (now containing the
// GUID needed to decrypt the bits) into a byte array
byte[] shuffled = new byte[bits.Length / 8];
bits.CopyTo(shuffled, 0);
// return the data, now shuffled. (this array should
// be the length of the original data, plus 16 bytes,
// since 16 bytes are needed to store the GUID).
return shuffled;
}
我发布这条消息可能是在开枪自杀,但如果不知道数据是用这种方法加密的,那么暴力破解需要n!时间,其中n是文件中的总位数。(基本上,比随机猜测GUID的概率高得多)。
假设GUID很好地隐藏在文件中,那么暴力攻击将需要很长时间才能弄清楚。
在找到这个解决方案的过程中,我花了很多时间学习加密,我读到的所有东西似乎都比这复杂得多(而且,很明显,我读的所有东西都涉及双方,加密可能涉及在他们之间传递密钥)。
我学到的是:
- 如果加密数据的密钥与数据一起存储,那么有人破解它并获取数据只是时间问题
- 不存在"完全安全"这回事。加密有不同程度的成功,一般来说,在选择加密方法时,您需要权衡数据安全的重要性以及程序解密数据的容易程度(考虑到处理器和内存限制)
我认为这太简单了,不可能成为一个好的解决方案。有人能证明这种怀疑吗,并向我解释为什么这不如其他加密方法安全吗?(或者让我很高兴,告诉我这很安全?)
我现在可以看到这种算法的缺点:
- 该算法要求所有数据都在内存中(不用太担心,因为我正在加密一个大约500字节的非常小的文件)
- 该算法需要更改读取数据的流的位置,以便提取GUID(基本上,您不能将文件从头流到尾进行解密)
需要注意的是,我的应用程序并不是很重要,实际上,恶意的人不太可能每次都使用反射器来查看我的代码(实际上,只是像我这样的人想知道某个东西是如何工作的,而不是造成任何伤害)。
这个算法不会给你带来太多好处。下载你的应用程序并使用Reflector的人会有你的加密数据和解密过程的代码。他们可以找到你解密数据的方法,然后使用它
问题是您将"加密密钥"存储在密码文本中。当攻击者也可以访问所使用的算法时,没有办法确保安全。使用什么加密系统并不重要。
你面临的基本问题是,手机应用程序本身必须拥有解密和使用数据所需的所有信息,所以任何查看代码的人都能看到这一点。
DVD等数字版权管理系统的破坏速度如此之快,也是出于同样的原因。任何能够播放受DRM保护的材料的设备或应用程序都必须有解密的方法。在设备或应用软件播放内容时,在内存中进行足够的戳戳,你就会找到解密密钥,然后你可以随时破解任何类似的受保护媒体。