410013796724260
• Webmoney
R335386147728
Z369087728698
Хеширование текста, MessageDigestХэширование - это процесс преобразования массива входных данных произвольной длины в битовую строку фиксированной длины соласно заданному алгоритму. Функция, реализующая алгоритм и выполняющая преобразование, называется «хэш-функцией». Исходные данные являются входным массивом или «сообщением». Результат преобразования называется «хэшом» или «хэш-кодом». Согласно принципу Дирихле однозначного соответствия между исходными данными и «хэш-кодом» не должно быть. Случай, при котором хэш-функция преобразует несколько разных сообщений в одинаковый «хэш» называется «коллизией». Вероятность возникновения коллизий используется для оценки качества алгоритма хэш-функции. Существует множество алгоритмов хэширования, отличающихся различными свойствами :
«Хорошая» хэш-функция должна удовлетворять двум свойствам : быстрое вычисление и минимальное количество «коллизий» (идеально - отсутствие коллизий). Выбор алгоритма получения «хэш-кода» определяется спецификой решаемой задачи. Простейшим примером хэш-функции может служить циклический избыточный код CRC (cyclic redundancy code). Значение хэш-суммы необходимо для проверки целостности данных и их идентификации. Как правило, хэш-суммами заменяют данные, которые не хранят в явном виде (например, пароли, ответы на вопросы тестов и т.д.). Также алгоритмы хэширования используются для проверки целостности и подлинности файлов. В качестве «хэш-кода» можно использовать дайджест сообщения, получаемый с помощью MessageDigest. Дайджест сообщения MessageDigestВ Java-криптографии для получения хэш-суммы текста используют дайджест сообщения MessageDigest. В конструкторе класса MessageDigest необходимо указать один из алгоритмов MD5 (Message Digest), SHA-1 (Secure Hash Algorithm) или SHA-256 : MessageDigest(String algorithm) Листинг функции получения MessageDigestВ функции getMessageDigest.java первоначально выполняется проверка нулевых значений алгоритма algo и сообщения text, после чего формируется MessageDigest. Методу update для формирования дайджеста необходимо передать в качестве параметра массив байт. Результатом выполнения функции является массив байт дайджеста сообщения, получаемый методом digest() класса MessageDigest.
byte[] getMessageDigest (final String algo, final String text)
{
if ((algo == null) || (algo.trim().length() == 0) || (text == null))
return null;
MessageDigest md = null;
try {
md = MessageDigest.getInstance(algo);
md.update(text.getBytes());
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
if (md != null)
return md.digest();
else
return null;
}
Пример использования MessageDigestРассмотрим пример MessageDigestExample.java, в котором для получения дайджеста сообщения MessageDigest будем использовать различные алгоритмы, определенные строкой ALGO. Текст сообщения, для которого определяется дайджест, читается из файла report.txt. После считывания файла в массив байт dataBytes для 3-х алгоритмов определяются дайджесты сообщений. Следует отметить, что размеры дайджестов для разных алгоритмов разные. Представление дайджеста сообщения выводится в консоль.
public class MDExample
{
private final String[] ALGO = {"MD5", "SHA-1", "SHA-256"};
private final MessageDigest[] MD = {null, null, null};
public void MessageDidgestTest()
{
try {
// Инициализация объектов MessageDigest
for (int i = 0; i < ALGO.length; i++)
MD[i] = MessageDigest.getInstance(ALGO[i]);
// Чтение файла
FileInputStream fis = new FileInputStream("report.txt");
// Массив данных
byte[] dataBytes = new byte[fis.available()];
int nread = 0;
while ((nread = fis.read(dataBytes)) != -1) {
MD[0].update(dataBytes, 0, nread);
MD[1].update(dataBytes, 0, nread);
MD[2].update(dataBytes, 0, nread);
}
fis.close();
for (int i = 0; i < MD.length; i++) {
byte[] mdbytes = MD[i].digest();
StringBuffer sb = new StringBuffer();
// convert the byte to hex format
for (int j = 0; j < mdbytes.length; j++) {
String s = Integer.toHexString(0xff & mdbytes[j]);
s = (s.length() == 1) ? "0" + s : s;
sb.append(s);
}
System.out.println(String.format(" %s", sb.toString()));
}
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
}
public static void main(String[] args)
{
MDExample app = new MDExample();
byte[] mdbytes = app.getMessageDigest("SHA-256", "length");
StringBuffer sb = new StringBuffer();
// convert the byte to hex format
for (int j = 0; j < mdbytes.length; j++) {
String s = Integer.toHexString(0xff & mdbytes[j]);
s = (s.length() == 1) ? "0" + s : s;
sb.append(s);
}
System.out.println(String.format("%s", sb.toString()));
System.out.println("\n");
app.MessageDidgestTest();
System.exit(0);
}
}
Результат выполнения программы в консоле будет иметь следующий вид : 0f82aca66af91493b1ff401de5f1f7e3e24e14560df3f6f7e465dbc915b9947d MessageDigest MD5(32) 2d42dab6607e2ffbf7f956a8fdd58259 MessageDigest SHA-1(40) 9dcd9200616ac6f39c9b761f68cec7bf0bb7c154 MessageDigest SHA-256(64) 79a2a06e22197eff4117c078aacfed2df7743559b40a86659fc712bb1457c5fe Скачать примерИсходный код рассмотренного примера в виде проекта Eclipse можно скачать здесь (5.26 Kб). |
