Verifyable日志文件
问题描述:
我们想在客户站点创建一个日志文件,其中Verifyable日志文件
- 客户能够读取日志(明文)
- 我们可以验证我们的网站日志文件ISN不可操纵
数据字节不可读没问题。但是,有些客户不会向我们发送无法验证他们不包含合理数据的文件。
我目前唯一合理的选择是附加密码校验和(例如SHA256(SECRET_VALUE + "logtext")
)。 SECRET_VALUE
将是硬编码,这是简单的“security through obscurity”。有没有更好的方法?
我们使用DotNet库,我不想手工实现任何加密算法。
答
您可以使用标准HMAC算法和密钥来执行校验和。
使用密钥可以以简单的方式防止校验和直接重新生成。硬编码密钥可以从代码中提取,但对于您的用例,我认为已足够
结果是二进制散列。要将其插入到文本文件中,请将值编码为十六进制或base64,并确保您能够恢复服务器端的进程,以便您可以再次使用原始文件计算哈希值。
你也可以使用一个分离的散列文件,以避免在我们身边修改日志文件
答
目标
- 客户可读的日志文件
- verifyable
- 最小的二进制数据
- 绝离线工作
选项
- 公私密钥的东西......(RSA,......)
- 将安全
- 但只有二进制数据
- 添加签名
- 我们不是第一个有这个想法的人(https://en.wikipedia.org/wiki/Hash-based_message_authentication_code)
- DotNet支持(System.Security.Cryptography.HMACSHA256)
- 密钥必须存储在某处...在源
- 即使混淆:不可能这样做安全
可信时间戳
-
再次
- :我们不是第一个(https://en.wikipedia.org/wiki/Trusted_timestamping)
- 需要连接到“受信任的第三方派对“(指Web服务)
- 构建哈希+时间戳 - >发送给第三方 - >签署数据(公钥 - 私钥) - >发送b ACK
迄今为止最好的
- 选项添加签名与HMAC
- 存储在本机代码的关键(不是那么容易提取)
- 获取代码混淆运行,并建立一些额外的循环在C#
- 每隔一段时间(5分钟?)将日志和的签名放入Windows应用程序日志中
- 应用程序日志中至少基本上固定以防止修改(只读) 并且它是由我们的错误报告
- 容易被顾客监督(邪恶的笑容)
感谢您指出我的HMAC收集 - 上救了我重新发明轮子 –