Шифрование и безопасность_Углубленное понимание алгоритмов хешированияв мы упомянули,
При хранении хешированного пароля пользователя его необходимо хранить с солью, чтобы противостоять атакам радужной таблицы.
digest = hash(input)
Именно потому, что одни и те же входные данные будут давать одинаковый результат, цель добавления соли состоит в том, чтобы изменить входные данные:
digest = hash(salt + input)
Эту соль можно рассматривать как дополнительный «код аутентификации». Один и тот же вход, но разные коды аутентификации будут давать разные выходные данные. Поэтому для проверки выходного хеша необходимо также предоставить «код аутентификации».
Алгоритм Hmac — это алгоритм кода аутентификации сообщений на основе ключей. Его полное название — на основе хэша. Message Authentication Код, более безопасный алгоритм дайджеста сообщений.。
Алгоритм Hmac всегда используется в сочетании с каким-либо алгоритмом хеширования. Например, мы используем алгоритм MD5, который соответствует алгоритму HmacMD5, эквивалентному «соленому» MD5:
HmacMD5 ≈ md5(secure_random_key, input)
Алгоритм HMAC (код аутентификации сообщения на основе хэша) — это алгоритм кода аутентификации сообщения, основанный на хэш-функции, используемый для проверки целостности сообщения и аутентификации отправителя сообщения. Он сочетает в себе хеш-функцию и ключ для генерации кода аутентификации сообщения путем хеширования ключа с сообщением.
Процесс расчета HMAC выглядит следующим образом:
После получения сообщения получатель также будет использовать тот же ключ и хэш-функцию для расчета значения HMAC сообщения и сравнения его со значением HMAC, отправленным отправителем. Если они совпадают, сообщение является полным и пришло от законного отправителя; в противном случае может возникнуть риск того, что сообщение было подделано или пришло от неавторизованного отправителя;
С точки зрения непрофессионала, алгоритм HMAC похож на «аутентификатор пароля», который гарантирует, что данные не будут подделаны во время передачи.
Представьте, что вы хотите отправить письмо другу, но беспокоитесь, что его кто-то подделал. Вы можете использовать HMAC для решения этой проблемы. Сначала вы поставите свою подпись на конверте. Но на этот раз вместо подписи ручкой используется специальная техника генерации «ключа». Этот ключ подобен вашему личному паролю, известному только вам и вашим друзьям.
Затем вы отправляете эту подпись вместе с письмом. После того, как ваш друг получит письмо, он тоже узнает ключ. Он снова сгенерирует подпись, используя тот же метод, а затем сравнит ее с отправленной вами подписью. Если обе подписи одинаковы, это означает, что письмо не было подделано, поскольку этот специальный «пароль» знаете только вы и ваш друг.
Таким образом, HMAC обеспечивает целостность и безопасность данных посредством механизма проверки двойного «пароля». Алгоритм HMAC обладает высокой безопасностью и широким применением и часто используется в сетевой связи, передаче данных, цифровой подписи и других областях для обеспечения целостности и безопасности данных.
Алгоритм HMAC (код аутентификации сообщения на основе хэша) можно использовать в сочетании со многими хеш-функциями. К наиболее часто используемым хеш-функциям относятся:
Эти алгоритмы предоставляют различные варианты хеш-функций, и соответствующий алгоритм может быть выбран на основе требований безопасности и соображений производительности. Обычно новые алгоритмы SHA-256 и SHA-512 считаются более безопасными, чем MD5 и SHA-1, и поэтому чаще используются в сценариях с более высокими требованиями безопасности.
ИспользуяJavaв стандартной библиотекеKeyGenerator
генерировать Безопасностьслучайныхключ,может гарантироватьключслучайныхсекси Безопасностьсекс,Тем самым повышая безопасность алгоритма шифрования.
KeyGenerator
类提供了генерироватьверно称ключфункция,может быть указано в соответствии салгоритми Безопасность随机数генерировать器来генерироватьключ。Обычно,Можно использовать
KeyGenerator.getInstance(String algorithm)
метод полученияKeyGenerator
Пример,KeyGenerator.init(int keysize)
Спецификация методаключдлина,KeyGenerator.generateKey()
методгенерироватьключ。这样генерироватьизключ通常会具有足够длинаи随机секс,Защищает от распространенных атак с использованием паролей.,Например, полный поиск и атака по словарю. поэтому,использоватьJavaв стандартной библиотекеKeyGenerator
генерировать Безопасностьслучайныхключ Это рекомендуемая практика,Помогает улучшить безопасность системы.
HmacMD5
можно рассматривать как наличие БезопасностьизkeyизMD5
。использоватьHmacMD5
вместо использованияMD5добавлятьsalt,Он имеет следующие преимущества:
HmacMD5
использоватьизkeyДлина64байт,Даже Безопасность;Hmac
это стандарталгоритм,То же самое относится и к другим хэшам, таким как алгоритм SHA-1;Hmac
выходи原有из Хэшалгоритм Одинаковая длина。Видно, что Hmac по сути представляет собой алгоритм, который смешивает ключи в дайджесты. При проверке этого хэша помимо исходных входных данных необходимо указать еще и ключ.
package com.artisan.securityalgjava.hmac;
import javax.crypto.KeyGenerator;
import javax.crypto.Mac;
import javax.crypto.SecretKey;
import java.math.BigInteger;
/**
* @author маленький мастер
* @version 1.0
* @mark: show me the code , change the world
*/
public class HmacTest {
public static void main(String[] args) throws Exception{
// создавать KeyGenerator экземпляр и укажите алгоритм как HmacMD5
KeyGenerator keyGen = KeyGenerator.getInstance("HmacMD5");
// Генерировать случайные ключи
SecretKey key = keyGen.generateKey();
// Распечатать случайно сгенерированные ключи
byte[] skey = key.getEncoded();
System.out.println("Случайно сгенерированный ключ:" + new BigInteger(1, skey).toString(16));
// создавать Mac экземпляр и укажите алгоритм как HmacMD5
Mac mac = Mac.getInstance("HmacMD5");
// инициализация Mac Пример
mac.init(key);
// Обновить новости
mac.update("HellArtisan".getBytes("UTF-8"));
// вычислить HMAC ценить
byte[] result = mac.doFinal();
// Распечатать HMAC ценить
System.out.println("HMAC ценить:" + new BigInteger(1, result).toString(16));
}
}
использоватьJava标准库генерироватьHmacMD5алгоритмслучайныхключ,ивычислитьданное сообщение(“HellArtisan
”)изHMACценить。
Мы можем использовать алгоритм Hmac для замены исходного пользовательского алгоритма засолки.,поэтому,Структура библиотеки данных, в которой хранятся имена пользователей и пароли, следующая:
| username | secret_key | password |
|----------|----------------------------------|---------------------------------------|
| bob | a8c06e05f92e...5e16 | 7e0387872a57c85ef6dddbaa12f376de |
| alice | e6a343693985...f4be | c1f929ac2552642b302e739bc0cdbaac |
| tim | f27a973dfdc0...6003 | af57651c3a8a73303515804d4af43790 |
В каждой строке содержится имя пользователя (username), случайно сгенерированный секрет (secret_key, длиной 64 байта) и хеш пароля (password), сгенерированный с помощью алгоритма Hmac. Ключ используется для расчета Hmac для обеспечения безопасности пароля.
package com.artisan.securityalgjava.hmac;
import java.util.Arrays;
import javax.crypto.*;
import javax.crypto.spec.*;
/**
* HMACПример:использоватьпредварительно сгенерированный ключвычислитьHMACценить
* @author artisan
*/
public class HmacVerifyTest {
public static void main(String[] args) throws Exception {
// предварительно сгенерированный ключ
byte[] hkey = new byte[]{106, 70, -110, 125, 39, -20, 52, 56, 85, 9, -19, -72, 52, -53, 52, -45, -6, 119, -63,
30, 20, -83, -28, 77, 98, 109, -32, -76, 121, -106, 0, -74, -107, -114, -45, 104, -104, -8, 2, 121, 6,
97, -18, -13, -63, -30, -125, -103, -80, -46, 113, -14, 68, 32, -46, 101, -116, -104, -81, -108, 122,
89, -106, -109};
// создаватьSecretKeyобъект
SecretKey key = new SecretKeySpec(hkey, "HmacMD5");
// Получить Макэкземпляр и укажите алгоритм какHmacMD5
Mac mac = Mac.getInstance("HmacMD5");
// использоватьключинициализацияMacПример
mac.init(key);
// Обновить новости
mac.update("HelloArtisan".getBytes("UTF-8"));
// вычислитьHMACценить
byte[] result = mac.doFinal();
// РаспечататьHMACценить
System.out.println(Arrays.toString(result));
// [-22, 82, 110, 65, -70, -122, 93, 121, 48, 96, -40, -78, 126, 46, -47, 112]
}
}
// создаватьSecretKeyобъект,использоватьпредварительно сгенерированный ключбайт数组иалгоритмимя"HmacMD5"
SecretKey key = new SecretKeySpec(hkey, "HmacMD5");
Функция этой строки кода — создать объект SecretKey, использовать предварительно созданный массив ключевых байтов (hkey) в качестве ключа и указать имя алгоритма как «HmacMD5».
это восстановлениеSecretKey
из代码。
По сравнению с прямым использованием алгоритма хеширования MD5, использование алгоритма HmacMD5 требует некоторых дополнительных шагов для генерации значения хеш-функции.
Вот шаги для генерации хеш-значения с использованием алгоритма HmacMD5:
HmacMD5
"получатьKeyGenerator
Пример。KeyGenerator
создаватьодинSecretKey
Пример,этотключбудет использоваться дляинициализацияMac
Пример。HmacMD5
"получатьMacПример。SecretKey
инициализацияMac
Пример,以指定использоватьизключ。Mac
Пример反复调использоватьupdate(byte[])
входитьданные,可以多次调использоватьupdate
метод以входитьданныеиз不同部分。Mac
ПримеризdoFinal()
методполучать最终из Хэшценить。这些步骤确保了использоватьHmacMD5
алгоритмгенерировать Хэшценить时из Безопасностьсекси正确секс。 HmacMD5
алгоритмкомбинированныйMD5
Хэшалгоритмиключ,Обеспечивает повышенную безопасность и защитные свойства.,Подходит для сценариев, где требуется проверка целостности сообщения и аутентификация личности.
https://github.com/aperezdc/hmac-sha256/blob/master/hmac-sha256.c
package com.artisan.securityalgjava.hmac;
import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
/**
* @author маленький мастер
* @version 1.0
* @mark: show me the code , change the world
*/
public class HmacSHA256Example {
public static void main(String[] args) {
// Новости для шифрования
String message = "Hello, HMAC!";
// ключ
String key = "secretKey";
try {
// вычислитьHMAC-SHA256ценить
byte[] result = calculateHmacSHA256(message, key);
// Преобразовать массив байтов в шестнадцатеричную строку
String hmacSHA256 = bytesToHex(result);
// РаспечататьHMAC-SHA256ценить
System.out.println("HMAC-SHA256: " + hmacSHA256);
} catch (NoSuchAlgorithmException | InvalidKeyException e) {
e.printStackTrace();
}
}
/**
* вычислитьHMAC-SHA256ценить
* @param message
* @param key
* @return
* @throws NoSuchAlgorithmException
* @throws InvalidKeyException
*/
public static byte[] calculateHmacSHA256(String message, String key)
throws NoSuchAlgorithmException, InvalidKeyException {
// создаватьHmacSHA256Пример
Mac hmacSHA256 = Mac.getInstance("HmacSHA256");
// создаватьключобъект
SecretKeySpec secretKey = new SecretKeySpec(key.getBytes(), "HmacSHA256");
// использоватьключинициализацияMacПример
hmacSHA256.init(secretKey);
// вычислить消息изHMAC-SHA256ценитьи返回
return hmacSHA256.doFinal(message.getBytes());
}
/**
* Преобразовать массив байтов в шестнадцатеричную строку
* @param bytes
* @return
*/
public static String bytesToHex(byte[] bytes) {
StringBuilder result = new StringBuilder();
for (byte b : bytes) {
result.append(String.format("%02x", b));
}
return result.toString();
}
}
сначала определено Новости для шифрованияиключ。Затем,использоватьcalculateHmacSHA256
методвычислить消息изHMAC-SHA256
ценить。наконец,Волявычислить得到избайт数组转换成十六进制字符串,и Распечататьвыход。