我的系统需要通过不安全的通道发送和接收数据。我想保持这个简单(它在嵌入式平台上运行,而不是PC),我不介意攻击者是否可以读取数据。我想要防止的是攻击者拦截数据并对其进行修改。
该平台具有用于散列(MD5,SHA1等)的内置函数,但不加密,因此我认为我所做的只是将与一些秘密数据连接的数据哈希以确保它是由我生成的系统而不是攻击者。例如:
dataToSend = dataString + sha1(dataString + secretString)
数据字符串以纯文本格式发送,后跟哈希值。秘密部分意味着攻击者无法在不使散列无效的情况下修改数据,除非他们以某种方式发现秘密,该秘密内置于程序中并且从不通过通道发送。我知道这个方案容易受到重播攻击;对于这个特定的应用程序来说,这不是问题。
我的问题是:如果秘密内置于应用程序并且永远不会更改,是否有人可以解决它是什么,如果他们有大量截获的数据字符串和哈希?嵌入的秘密可执行文件本身由平台加密,因此没有机会用十六进制编辑器发现秘密。
其次,这个秘密有多长?数据字符串通常为8个字节。如果我有更长的秘密(例如1024字节),试图使其不可思议,那么哈希算法的大部分输入将永远不会改变。这会不会以某种方式降低安全性?
谢谢!
答案 0 :(得分:0)
密钥认证的标准技术是HMAC。除非您有特殊原因,否则我建议您使用HMAC来解决问题。
密钥长于数据是一个非常好的主意。您的数据是64位,因此使用HMAC-SHA-256会产生256位密钥,是数据的两倍。如果您愿意,可以使用不同的密钥大小,HMAC对于他们接受的密钥大小非常灵活。