嘲笑明文验证(不是密码)

问题描述:

我有一个系统需要通过一个不安全的通道发送和接收数据。我想保持这个简单(它运行在嵌入式平台上,而不是PC上),我不介意攻击者是否可以读取数据。我想要阻止的是攻击者拦截数据并对其进行修改。嘲笑明文验证(不是密码)

该平台内置哈希函数(MD5,SHA1等),但没有加密,所以我想我会做的只是散列数据连接的一些秘密数据,以确保它是由我的系统而不是攻击者。例如:

dataToSend = dataString + sha1(dataString + secretString) 

数据字符串以纯文本形式发送,然后是散列。秘密部分意味着攻击者不能修改数据而不使哈希无效,除非他们以某种方式发现秘密,这是构建在程序中并且从未通过该通道发送的。我知道这个方案容易受重播攻击的影响;这对于这个特定的应用程序来说不是问题。

我的问题是:如果秘密是内置在应用程序中,并且永远不会改变,有没有办法让人知道它是什么,如果他们有大量截获的数据字符串和哈希?秘密将被嵌入的可执行文件本身是由平台加密的,所以没有机会使用十六进制编辑器发现秘密。其次,这个秘密有多长时间?数据字符串通常是8个字节。如果我有更长的秘密(例如1024字节),为了使其无法猜测,那么散列算法的大部分输入将永远不会改变。这是否使它不太安全?

谢谢!

键控认证的标准技术是HMAC。除非你有特殊的理由否则,我建议你使用HMAC来解决你的问题。

把关键字比数据长是一个非常好的主意。您的数据为64位,因此使用HMAC-SHA-256将提供一个256位密钥,两倍于您的数据。如果你愿意,你可以使用不同的密钥大小,HMAC对他们接受的密钥大小非常灵活。

+0

这就是我正在寻找的!非常感谢! – kernelpanic99 2012-01-02 21:53:46