Возможно ли столкновение SHA-512 с использованием этой стратегии создания хеша?
Предполагая, что я использую этот код для генерации хэшей:
static void Main(string[] args) {
string id = Guid.Parse("8681941A-76C2-4120-BC34-F800B5AAB5A5".ToLower()).ToString();
string date = DateTime.Today.ToString("yyyy-MM-dd");
Console.WriteLine(id);
Console.WriteLine(date);
using (System.Security.Cryptography.SHA512Managed hashTool =
new System.Security.Cryptography.SHA512Managed()) {
Byte[] PasswordAsByte = System.Text.Encoding.UTF8.GetBytes(string.Concat(id, date));
Byte[] EncryptedBytes = hashTool.ComputeHash(PasswordAsByte);
hashTool.Clear();
Console.WriteLine(Convert.ToBase64String(EncryptedBytes));
}
Console.ReadLine();
}
В реальном примере я сгенерирую хэши с GUID и датой, как вы видите на примере. Я получу эти значения из базы данных.
При таком подходе возможно ли когда-нибудь получить одинаковый результат хеширования с разными значениями?
Редактировать:
Как я уже сказал, я потяну базу данных значений. Как вы можете догадаться, Guid - это уникальный идентификатор ключа (если я не сталкиваюсь с чудом, и сервер sql генерирует один и тот же Guid для меня несколько раз). И значение datetime будет датой оплаты для записи. Я продемонстрировал здесь с DateTime.Today
но я не буду определенно использовать это на продукт.
3 ответа
Вы обязательно получите хеш-коллизию для данного GUID, который был получен более одного раза в один и тот же день. Например, если вы генерируете хеш для определенного GUID g
потом тянет g
в 2012-02-20 в 12:00 выдает тот же хеш, как если бы вы извлекли его в 18:00, поскольку вы учитываете только дату, а не время.
Для несвязанных идентификаторов GUID все еще возможно столкновение хеша. Пространство возможных хэшей составляет 64 бита, что меньше бесконечности, что означает, что обязательно должны быть повторы в соответствии с принципом голубых дыр. Тем не менее, это крайне маловероятно - на самом деле, это настолько маловероятно, что вы должны рассматривать его как ноль.
Как и в любой хэш-функции, это может случиться очень и очень редко.
Хорошая хеш-функция дает другой результат от двух соседних входов. SHA512 считается хорошим алгоритмом хеширования, поэтому он не должен быть проблемой в вашем случае.
Я не понимаю все эти обсуждения? даже если у вас есть 10 миллионов записей в вашей базе данных, вероятность столкновения равна
0.000000000003% (посмотрел, что для sha256, поэтому шансы для sha512 еще меньше)
даже если у вас есть 100 миллионов записей, вам не стоит об этом беспокоиться, и если вы действительно хотите быть уверены, поместите что-нибудь между текстом, а затем хешируйте его.
$newtext= wordwrap("mytexttexttext", 8, "myspliter", true);