我试图考虑数据完整性。我有一个要序列化到数据库中的对象。一旦它被序列化,我将对其进行哈希处理并将其作为单独的列与数据一起存储在数据库中。
然后,当我从数据库中获取数据时,我可以检查散列,然后在散列匹配的情况下反序列化数据。
这样做有什么意义还是我只是在浪费 CPU?是否有其他方法存储序列化对象,然后验证数据库中的数据未被篡改。存储数据的程序可能与读取数据的程序不同。
我的具体示例是创建一个 EmailMessage 对象(因为 System.Net.Mail.MailMessage 无法序列化)、序列化它并创建哈希。两者都存储在数据库中。稍后我可以使用序列化的 EmailMessage 和哈希。我检索 EmailMessage 并创建另一个哈希。如果原始散列与新散列相同,则填充 MailMessage 对象并发送它。否则,创建一个 TamperedWithException()。
下面的代码是我用来制作散列的代码。我正在使用 json.net 进行序列化。
public static class MD5HashHelper
{
public static string CreateHash(string str)
{
string hash;
using (System.Security.Cryptography.MD5 md5 = System.Security.Cryptography.MD5.Create())
{
hash = BitConverter.ToString(
md5.ComputeHash(Encoding.UTF8.GetBytes(str))
).Replace("-", String.Empty);
}
return hash;
}
public static bool CompareWithHash(this string str, string hash)
{
string strHash = CreateHash(str);
return strHash.Equals(hash,StringComparison.Ordinal);
}
}
这个特定的表还没有加密。攻击者可以进行更改并创建另一个哈希。这就是为什么我认为可能有更好的方法来做到这一点的部分原因。
下面是序列化:
public static class JSONHelper
{
public static string ToJSON(this object obj)
{
string json = JsonConvert.SerializeObject(obj);
return json;
}
public static T JSONToObject<T>(this string json)
{
Object obj = JsonConvert.DeserializeObject<T>(json);
return (T)Convert.ChangeType(obj, typeof(T));
}
}
最佳答案
只要保密,盐就可以提供帮助。但这是一个问题,因为它也必须可供合法签名者使用,因此可能会供攻击者使用。是散列盐不是什至不理会散列。我的攻击:读取数据,进行我的更改,创建一个新的散列,保存修改后的数据并将散列返回到数据库。
有针对此类攻击的解决方案,但您必须定义要保护的内容的值(value)以及保护对象的值(value)。当数据不能同时使用时,哈希通常适用于数据。例如,Apple 在一个 channel 上提供他们的更新,并将哈希值通过电子邮件发送到他们的安全电子邮件列表,这是一个单独的 channel 。
如果没有严格的访问限制和 HSM 等硬件,通常不可能尝试保护所有攻击者的安全。即使那样,也有国家拥有巨额预算,最终Rubber-hose cryptanalysis .
关于c# - 序列化和散列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40471918/