加盐哈希以验证明文(不是密码)
Posted
技术标签:
【中文标题】加盐哈希以验证明文(不是密码)【英文标题】:Salting a hash for authentication of plaintext (NOT a password) 【发布时间】:2012-01-31 08:24:14 【问题描述】:我的系统需要通过不安全的通道发送和接收数据。我想保持简单(它在嵌入式平台上运行,而不是 PC),我不介意攻击者是否可以读取数据。我要防止的是攻击者拦截数据并对其进行修改。
该平台具有用于散列(MD5、SHA1 等)的内置函数,但没有加密,所以我想我要做的只是将数据与一些秘密数据连接起来进行散列,以确保它是由我生成的系统而不是攻击者。例如:
dataToSend = dataString + sha1(dataString + secretString)
数据字符串以明文形式发送,后跟散列。秘密部分意味着攻击者无法在不使散列无效的情况下修改数据,除非他们以某种方式发现了秘密,该秘密内置于程序中并且从未通过通道发送。我知道这个方案容易受到重放攻击;对于这个特定的应用程序来说,这不是问题。
我的问题是:如果秘密内置在应用程序中并且永远不会改变,那么如果他们有大量截获的数据字符串和哈希值,是否有办法弄清楚它是什么?将嵌入机密的可执行文件本身已由平台加密,因此无法使用十六进制编辑器发现机密。
其次,这个秘密有多长有关系吗?数据字符串通常为 8 个字节。如果我有一个更长的秘密(例如 1024 字节),试图让它不可猜测,那么哈希算法的大部分输入将永远不会改变。这是否会降低安全性?
谢谢!
【问题讨论】:
【参考方案1】:密钥认证的标准技术是HMAC。除非您有特殊原因,否则我建议您使用 HMAC 来解决您的问题。
让密钥比数据长是一个非常好的主意。您的数据是 64 位,因此使用 HMAC-SHA-256 将提供 256 位密钥,是您数据的两倍。如果您愿意,您可以使用不同的密钥大小,HMAC 对于它们接受的密钥大小非常灵活。
【讨论】:
这正是我想要的!非常感谢!以上是关于加盐哈希以验证明文(不是密码)的主要内容,如果未能解决你的问题,请参考以下文章