Лабораторна робота № 6 Захист даних від модифікацій та підміни, КСУ, Київський славістичний університет
« НазадЛабораторна робота № 6
|
Алгоритм |
Клас реалізації за умовчанням |
Розмір хешу (у бітах) |
MD5 |
MD5CryptoServiceProvider |
128 |
SHA-1 |
SHA1СryptoServiceProvider |
160 |
SHA-256 |
SHA256Managed |
256 |
SHA-384 |
SHA384Managed |
384 |
SHA-512 |
SHA512Managed |
512 |
Наступний фрагмент підраховує хеш-коди для тестового файлу до і після невеликої зміни і порівнює їх. Він включає допоміжну функцію, що перевіряє масиви байт на рівність шляхом перебору всіх байт:
Private Function CompareByteArray(ByVal BYTESA() As Byte, ByVal BYTESB() As Byte) As Boolean
If Not BYTESA.Length = BYTESB.Length Then Return False Dim i As Integer For i = 0 To BYTESA.Length - 1 If Not BYTESA(i) = BYTESB(i) Then Return False Next Return True End Function
Private Sub Hashing()
' Створення нового файлу. Dim fs As New FileStream("testfile.bin", FileMode.Create)
' Запис деяких даних. Dim w As New StreamWriter(fs) w.WriteLine("This is the first line.") w.WriteLine("This is the second line.") w.Flush()
' Обчислення 512-бітового (64-байтового) хеш-коду для файлу. Dim SHA As New SHA512Managed() fs.Position = 0 Dim HASHA() As Byte = SHA.ComputeHash(fs)
' Відображення хеш-коду. TextSource1 = BitConverter.ToString(HASHA)
' Додавання символу у файл і повторне обчислення хеш-коду. w.Write("!") w.Flush() fs.Position = 0 Dim HASHB() As Byte = SHA.ComputeHash(fs)
If CompareByteArray(HASHA, HASHB) Then MessageText = "Хеш-коди ідентичні!" Else MessageText = "Невідповідність хеш-кодів!" End If
TextSource2 = BitConverter.ToString(HASHB)
fs.Close()
End Sub |
Для гарантії цілісності даних зберігайте хеш-код в безпечному місці (такому, наприклад, як захищена БД), інакше зловмисник зможе підробити документ, згенерувати новий хеш-код і замінити ним оригінальний хеш-код.
2.2. Створення хеш-коду, захищеного від підміни
Якщо хеш-код потрібно зберігати в небезпечному місці або разом з самими даними, можна створити хеш-код, захищений від підміни. Хеш-коди мають одне очевидне обмеження: якщо не зберігати їх в безпечному місці, ніщо не перешкодить зловмисникові підмінити ваші дані і згенерувати новий хеш-код, відповідний зміненим даним. Таку зміну даних визначити неможливо. Ця проблема часто зустрічається при розробці розподілених додатків, що використовують хеш-коди для перевірки повідомлень отримуваних по мережі.
Вирішенням даної проблеми є створення хеш-коду, що не допускає відтворення зловмисником. Наприклад, ви можете зашифрувати хеш-код з використанням секретного ключа, недоступного зломщикові. Цей підхід називається алгоритмом генерування зашифрованого хеш-коду. Microsoft .NET Framework підтримує два таких алгоритму (таблиця 6.2); відповідні ним класи проведені від класу KeyedHashAlgorithm з простору імен System.Security.Cryptography. Їх головна відмінність від звичайних класів алгоритмів генерування хешу в тому, що вони включають властивість Key, що служить для зберігання секретного ключа (послідовності байт), який знадобиться при генерації хешу.
Таблиця 6.2
Класи алгоритмів генерування зашифрованого хеш-коду
Алгоритм |
Клас реалізації за умовчанням |
Розмір хешу (у бітах) |
Розмір ключа |
HMAC-SHA1 |
MAC-3DES-CBC |
160 |
64 (рекомендується) |
HHACSHA1 |
HACTripleDES |
64 |
8, 16 або 24 |
Наступний фрагмент генерує зашифровані хеш-коди для одних і тих же даних, використовуючи два різних ключа. Зверніть увагу: підсумкові хеш-коди будуть різними.
Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click ' Створення нового файлу. Dim fs As New FileStream("testfile.bin", FileMode.Create)
' Запис даних. Dim w As New StreamWriter(fs) w.WriteLine("This is the first line.") w.WriteLine("This is the second line.") w.Flush()
' Обчислення зашифрованого хеш-коду для файлу. Dim HMACSHA As New HMACSHA1() fs.Position = 0 Dim HASHA() As Byte = HMACSHA.ComputeHash(fs)
' Відображення хеша. TextSource1 = BitConverter.ToString(HASHA)
'Обчислення зашифрованого хеша по тому ж алгоритму 'для тих же даних, але з використанням іншого ключа, fs.Position = 0 HMACSHA = New HMACSHA1() Dim HASHB() As Byte = HMACSHA.ComputeHash(fs)
' Відображення хешу. TextSource2= BitConverter.ToString(HASHB)
fs.Close()
' Порівняння хеш-кодів. If CompareByteArray(HASHA, HASHB) Then MessageText = "Хеш-коди ідентичні!" Else MessageText = "Невідповідність хеш-кодів!" End If
End Sub |
3. Створення цифрового підпису для ХМL-документу
Для шифрування XML-вмісту файлу або масиву байт можна використовувати способи хешування і підписання даних, розглянуті в п. 3, так само, як і при генерації хешу для даних будь-якого іншого типу. Проте з цим підходом пов'язані перераховані далі обмеження.
Немає простого способу створити хеш-код і потім перетворити підсумковий документ (початковий код XML і хеш-код) в коректний XML-документ.
Незначні відмінності XML-документів (такі як додаткові порожні місця) приводитимуть до зміни хеш-коду, не впливаючи на синтаксичний аналіз XML-даних. Це може стати особливо серйозною проблемою, якщо створений в одній системі хеш-код вам потрібно перевіряти в додатку, написаному на іншій мові програмування, або за допомогою інших інструментів XML.
Немає простого способу підписання тільки частини XML-документа (або підписання різних його частин підписами різних користувачів).
Вирішення цих проблем описані в рекомендації XML Signatures консорціуму W3C (http://www.wЗс.org/xmldsig-core). Рекомендація XML Signatures визначає стандартний спосіб підписання XML-документів і канонічну репрезентацію XML, яка потрібна для того, щоб ідентичні документи завжди генерували однакові підписи. Проте стандарт XML Signatures визначає ті ж алгоритми підписання, що використовуються для даних будь-яких інших типів.
У .NET Framework стандарт XML Signatures реалізований у вигляді типів з простору імен System.Security.Cryptography.Xml. Для доступу до цих типів ви повинні додати посилання на збірку System.Security.dll.
Існують три типи підписів XML-документів:
- відокремлений (detached) зберігається як окремий XML-фрагмент, що посилається на підписаний документ за допомогою URI (Uniform Resource Identifier);
- огортаючий (enveloping) грає роль оболонки для XML-документа;
- вставлений (enveloped) вставляється в початковий XML-документ, що містить підписувану інформацію.
Технологія .NET дає можливість створювати підписи всіх цих типів. Нижче наведений код Windows-додатку, який створює і верифікує вставлені підписи. Ось код початкового XML-документа:
<0rders> <0rder> <Name>Toaster Oven</Name> <Price>400.99</Price> </0rder> </0rders> |
Підписаний XML-документ складається із початкових XML-даних і підпису, що включає інформацію про алгоритм, який був використаний для її створення, а також відкритий ключ, потрібний для її верифікації.
Private Sub Signing() ' Завантаження XML-даних, які потрібно підписати. Dim Doc As New XmlDocument Doc.Load("doc.xml")
' Створення підпису XML. Dim SignedXml As New SignedXml(Doc)
' Підписання даних всього документа. Можна скласти цей вираз XPath ' так, щоб він указував на один елемент. Dim Reference As New Reference() Reference.Uri = "#xpointer(/)~" SignedXml.AddReference(Reference)
' Використовується перетворення, потрібне для обернутих підписів. Reference.AddTransform(New XmlDsigEnvelopedSignatureTransform())
' Для створення підпису використовується алгоритм RSA. Dim Rsa As New RSACryptoServiceProvider()
' Додавання інформації про ключ в підпис. SignedXml.SigningKey = Rsa Dim KeyInfo1 As New KeyInfo KeyInfo1.AddClause(New RSAKeyValue(Rsa)) SignedXml.KeyInfo = KeyInfo1
' Обчислення підпису. SignedXml.ComputeSignature()
' Отримання XML-репрезентації підпису. Dim XmlSignature As XmlElement = SignedXml.GetXml()
' Вставка XML-підпису в документ. Dim Node As XmlNode = Doc.ImportNode(XmlSignature, True) Dim Root As XmlNode = Doc.DocumentElement Root.InsertAfter(Node, Root.FirstChild)
' Збереження XML-документа, що містить обернутий підпис. Doc.Save("SignedDoc.xml")
' Відображення повного документа разом з підписом. TextSource = Doc.OuterXml End Sub |
Верифікація підписаних даних
Private Sub Verifying()
' Завантаження підписаного XML-документа. Dim Doc As New XmlDocument() Doc.Load("SignedDoc.xml")
' Створення об'єкту SignedXml для верифікації підпису. Dim SignedXml As New SignedXml(Doc)
' Знаходження першого підпису. Dim Node As XmlNode = Doc.GetElementsByTagName("Signature", "http://www.w3.org/2000/09/xmldsig#")(0) SignedXml.LoadXml(Node)
' Верифікація підпису. If SignedXml.CheckSignature() Then MessageBox.Show("Signature authenticated.") Else MessageBox.Show("Invalid signature.") End If End Sub |
Практичне завдання
1. Обчислити значення хеш-функції для довільного документу MS Word.
Варіант 1 — хеш-функція MD5
Варіант 2 — хеш-функція SHA-1
Варіант 3 — хеш-функція SHA-256
Варіант 4 — хеш-функція SHA-512
2. Створити захищений від підміни хеш-код для одного документу до і після його модифікації. Перевірити відповідність хеш-кодів.
3. Створити XML-документ, який містить дані про студентів групи (Прізвище, Ім’я, Вік, Стать…) та підписати його цифровим підписом.
4. Перевірити правдивість отриманих XML-даних.
Контрольні запитання
-
Що таке електронний цифровий підпис?
-
Для чого призначений електронний цифровий підпис?
-
Які умови повинні виконуватися при передачі даних?
-
Яка послідовність формування цифрового підпису?
-
Що таке хеш-функція?
-
Яким умовам повинна відповідати хеш-функція?
-
Які відомі класи алгоритмів генерування хешу?
-
Які існують типи підписів XML-документів?
[1] ISO - Міжнародна організація по стандартизації (МОС), ITU - Міжнародний союз електрозв'язку (МСЕ).
З повагою ІЦ “KURSOVIKS”!