Генерация хэша MD5 в PHP

В этом руководстве мы покажем вам, как можно сгенерировать хеш MD5 строки в PHP.

Прежде чем мы начнем, не используйте MD5 при создании хэшей для чего-либо, связанного с безопасностью, включая пароли. Это связано с тем, что хеши MD5 могут генерироваться невероятно быстро в современных системах и больше не считаются криптографически безопасными.

Хотя MD5 больше не полезен для безопасности, он по-прежнему используется в PHP. Хотя быстрый хэш обычно ужасен по соображениям безопасности, он все же может быть полезен во многих других случаях.

Одним из таких применений является проверка подлинности файла. Например, изменение хэша указывает на то, что содержимое файла не идентично.

Некоторые общедоступные службы даже используют хэш MD5 как способ передачи строки, которая должна быть в некоторой степени приватной, но не обязательно безопасной. Прекрасным примером одного из таких сервисов является популярная глобальная система аватаров Gravatar.

Служба аватаров Gravatar использует MD5 адреса электронной почты пользователя, чтобы предоставить аватар для этого конкретного пользователя. Это обеспечивает определенный уровень запутывания и означает, что адрес электронной почты пользователя не нужно указывать в URL-адресе.

Другой пример, где MD5 по-прежнему используется по умолчанию, — это прокси-кеш NGINX. Он использует MD5 для создания уникального ключа кэша для этого запроса.

В следующем разделе мы покажем вам, как можно сгенерировать хэш MD5 в PHP.

Функция md5() в PHP

Функция md5() в PHP невероятно проста в использовании. У него есть только два параметра, о которых вам нужно беспокоиться, и если вам не нужны двоичные данные, второй совершенно необязателен.

Если вы хотите сгенерировать хэш файла MD5, существует другая функция, которая называется « md5_file() », о котором мы поговорим позже.

Ниже вы можете увидеть синтаксис функции md5() в PHP.

В первом параметре ( $string ) вы указываете данные, для которых вы хотите, чтобы PHP генерировал хэш MD5. Эти данные должны быть переданы в виде строки PHP.

Второй параметр ( $binary ) позволяет вам контролировать, будет ли возвращаться хэш в виде 32-символьной шестнадцатеричной строки ( false ) или будет ли возвращаться необработанный 16-битный двоичный файл ( верно ). Этот параметр является необязательным и в большинстве случаев не требуется.

Пример возврата шестнадцатеричной строки MD5 в PHP

В этом примере мы будем использовать PHP для генерации хэша MD5 строки « Hello PiMyLIfeUp Viewer ». Поскольку нам нужен шестнадцатеричный формат, все, что нам нужно сделать, это передать эту строку в первом параметре.

Чтобы показать вам сгенерированный хэш, мы используем встроенную в PHP функцию эха для вывода результата.

Используя этот небольшой фрагмент кода, вы должны получить следующий хеш. Пока вы используете одну и ту же строку, они всегда должны оставаться одинаковыми.

Пример получения двоичного формата MD5

Как и в предыдущем примере, мы снова будем использовать MD5 для генерации хэша.

Мы будем использовать ту же строку « Hello PiMyLifeUpViewer », но на этот раз мы также включим формат « двоичный », передав « true » второму параметру.

Если установить для второго параметра значение true, функция PHP md5() вернет хэш в виде необработанного 16-битного двоичного кода.

После выполнения приведенного выше примера хэш MD5 теперь должен отображаться в двоичном формате. Как показано ниже, это будет выглядеть как странная мешанина символов при отображении непосредственно на экране.

Обычно большинство людей предпочитают использовать шестнадцатеричный формат, а не двоичный.

Генерация MD5-хэша файла в PHP

PHP имеет встроенную функцию, позволяющую легко генерировать MD5-хэш файла. Эта функция называется « md5_file ».

Использование этой функции относительно похоже на базовую функцию md5() . Однако первый параметр изменился.

Вместо указания строки, которую вы хотите хешировать, вы укажете путь к файлу, для которого PHP должен сгенерировать хэш MD5.

Определение функции PHP md5_file показано ниже.

В параметре « $filename » вы должны указать путь к файлу, для которого вы хотите сгенерировать хэш MD5. Помните, что этот путь должен быть либо относительным к текущему расположению файлов PHP, либо быть абсолютным путем.

Параметр $binary позволяет вам контролировать, возвращает ли PHP хеш в виде 32-символьной шестнадцатеричной строки ( false ) или 16-битного двоичного файла ( true ). По умолчанию установлено значение false , и оно подходит для большинства случаев использования.

В случае успеха функция md5_file вернет строку, содержащую либо 32-символьную шестнадцатеричную строку, либо 16-битную двоичную. Это зависит от того, что вы установили для параметра « $binary ».

В случае ошибки PHP вернет логическое значение false . Сбой обычно происходит, когда PHP не может получить доступ к указанному файлу.

Пример создания хэша MD5 файла с использованием шестнадцатеричного формата

В этом примере мы будем использовать PHP для создания хэша MD5 нашего файла « index.html », который находится рядом с нашим скриптом PHP. Мы сохраним это имя файла в переменной с именем « $file ».

Затем мы используем функцию md5_file, передавая путь к нашему файлу, хранящемуся в « $file ” в первый параметр.

Хэш файла MD5 будет напечатан PHP на выходе благодаря ключевому слову echo.

После запуска этого кода PHP сгенерирует хэш для файла, расположенного в том же каталоге, что и « index.html ».

Будет выведен хэш MD5, сгенерированный PHP. Для нашего примера файла мы получили следующий 32-символьный шестнадцатеричный хеш.

Пример получения хэша MD5 файла с использованием двоичного формата

В этом примере мы сгенерируем хэш MD5 для нашего файла и выведем его в двоичном формате.

Начните этот пример с создания переменной с именем « $file » и присвоения ей пути к вашему файлу. В нашем случае мы будем использовать « index.html », который находится рядом с нашим тестовым скриптом PHP.

Наконец, мы вызываем функцию md5_file() . В первый параметр мы передаем переменную, содержащую путь к нашему файлу.

Второму параметру мы установили значение true . Установив для второго параметра значение true, мы указываем md5_file() выводить хэш в двоичном формате вместо шестнадцатеричного.

Будет выведен результат этого хеша. Поскольку это двоичный формат, полученный хеш может выглядеть как странная смесь символов при отображении на экране.

Ниже приведен пример двоичного вывода для нашего примера файла. Вы, вероятно, захотите придерживаться шестнадцатеричной строки для большинства случаев использования.

Заключение

В этом руководстве мы показали вам, как сгенерировать хэш MD5 в PHP. Хотя MD5 в основном бесполезен для безопасности, он все же имеет различные варианты использования.

В PHP встроены две функции, которые позволяют быстро генерировать хэш MD5 для строки или файла.

Пожалуйста, прокомментируйте ниже, если у вас возникли проблемы с использованием любой из этих функций.

Обязательно ознакомьтесь со многими другими нашими руководствами по PHP и другими нашими руководствами по программированию.

PHP md5 в JavaScript | Locutus

 

module.exports = function md5 (str) {

// обсудить на: https://locutus.io/php/md5/

// оригинал: Webtoolkit.info (https:/ /www.webtoolkit.info/)

// улучшено: Майкл Уайт (https://getsprink.com)

// улучшено: Джек

// улучшено: Кевин ван Зонневельд (https://kvz .io)

// ввод: Бретт Замир (https://brett-zamir.me)

// исправлено: Кевин ван Зонневельд (https://kvz. io)

// примечание 1: Имейте в виду, что в соответствии с PHP буферизуется вся строка, а затем

// примечание 1: хешируется. Если возможно, мы рекомендуем использовать встроенные криптомодули Node напрямую

// примечание 1: в паровом режиме для более быстрого и эффективного хеширования

// пример 1: md5('Kevin van Zonneld')

// возвращает 1: '6e658d4bfcb59cc13f96c14450ac40b9'

let hash

try {

const crypto = require('crypto')

const md5sum = crypto.createHash('md5')

md5sum.update(str)

хэш = md5sum.digest('hex')

} catch (e) {

хеш = не определено 03

}

if (hash !== undefined) {

return hash

}

const utf8Encode = require('../xml/utf8_encode')

let xl

const _rotateB03 { 903, i903, i903, i903, i9003, i9003

возврат (lValue << iShiftBits) | (lValue >>> (32 - iShiftBits)) 9(x | (~z)))

}

const _FF = функция (a, b, c, d, x, s, ac) {

a = _addUnsigned(a, _addUnsigned(_addUnsigned(_F(b, c, d), x), ac))

return _addUnsigned(_rotateLeft(a, s), b)

}

const _GG = function (a, b, c, d, x, s, ac) {

a = _addUnsigned(a, _addUnsigned(_addUnsigned(_G(b, c, d), x), ac))

return _addUnsigned(_rotateLeft(a, s), b)

}

const _HH = функция (а, б, в, г, х, с, ас) {

a = _addUnsigned(a, _addUnsigned(_addUnsigned(_H(b, c, d), x), ac))

return _addUnsigned(_rotateLeft(a, s), b)

}

const _II = функция (a, b, c, d, x, s, ac) {

a = _addUnsigned(a, _addUnsigned(_addUnsigned(_I(b, c, d), x), ac))

return _addUnsigned(_rotateLeft( a, s), b)

}

const _convertToWordArray = function (str) {

let lWordCount

const lMessageLength = str. length

const lnumberofwordstemp1 = lmessageLength + 8

const lnumberofwordstemp2 = (lnumberofwordstemp1 - (lnumberofwordstemp1 % 64)) / 64

const lnumberofword = (lnumberofwordstemp2 + 1) * 160003

ConstrayForle = riswrayForlestemp2 + 1) * 160003

lBytePosition = 0

let lByteCount = 0

while (lByteCount < lMessageLength) {

lWordCount = (lByteCount - (lByteCount % 4)) / 4

lBytePosition = (lByteCount 8 % 9) *0003

LWordArray [LWordCount] = (LWordArray [LWordCount] |

(Str.Charcodeat (lbytecount) << lbyteposition))

lbytecount ++

}

Lwordcount = (lbytecount - (lbytecptec %). lBytePosition = (lByteCount % 4) * 8

lWordArray[lWordCount] = lWordArray[lWordCount] | (0x80 << lBytePosition)

lWordArray[lNumberOfWords - 2] = lMessageLength << 3

lWordArray[lNumberOfWords - 1] = lMessageLength >>> 29

return LWordArray

}

const _WordToHex = function (lvalue) {

Let WordToHexValue = ''

Let WordToHexValUETEM 3; lCount++) {

lByte = (lValue >>> (lCount * 8)) & 255

wordToHexValueTemp = '0' + lByte. toString(16)

wordToHexValue = wordToHexValue + wordToHexValueTemp.substr(wordToHexValueTemp.-length) 2, 2)

}

return wordtohexvalue

}

Let x = []

Let K

Let AA

Let BB

LET CC

LET DD

LET A

LET LET B

LET DD

LET A

LET B

LET LAT C

LAT LAT LAT C

2

LET LAT C

LET LAT LAT C

LET LAT C

Let D

Const S11 = 7

Const S12 = 12

Const S13 = 17

Const S14 = 22

Const S21 = 5

CONST S22 = 9

CONST S23 = 14 0003

CONST S24 =. 20

константа S31 = 4

const s32 = 11

const s33 = 16

const s34 = 23

const s41 = 6

const s42 = 10

const s43 = 15

const s44 = 21

str = utf8encode (str)

x = _converttowordarray (str)

a = 0x67452301

b = 0xefcdab89

C = 0x98BADCFE

d = 0x10325476

xl = x. lendle

для (k = xl x.10002

для (k = x. x. x.10003

для 16) {

АА = а

ВВ = б

CC = c

DD = d

a = _FF(a, b, c, d, x[k + 0], S11, 0xD76AA478)

d = _FF(d, a, b, c, x[ k + 1], S12, 0xE8C7B756)

c = _FF(c, d, a, b, x[k + 2], S13, 0x242070DB)

b = _FF(b, c, d, a, x[ k + 3], S14, 0xC1BDCEEE)

a = _FF(a, b, c, d, x[k + 4], S11, 0xF57C0FAF)

d = _FF(d, a, b, c, x[ k + 5], S12, 0x4787C62A)

c = _FF(c, d, a, b, x[k + 6], S13, 0xA8304613)

b = _FF(b, c, d, a, x[ к + 7], S14, 0xFD469501)

а = _FF(a, b, c, d, x[k + 8], S11, 0x698098D8)

d = _FF(d, a, b, c, x[k + 9], S12, 0x8B44F7AF)

c = _FF(c, d, a, b, x[k + 10], S13, 0xFFFF5BB1)

b = _FF(b, c, d, a, x[k + 11], S14, 0x895CD7BE)

a = _FF(a, b, c, d, x[k + 12], S11, 0x6B2)

d = _FF(d, a, b, c, x[k + 13], S12, 0xFD987193)

c = _FF(c, d, a, b, x[k + 14], S13, 0xA679438E)

b = _FF(b, c, d, a, x[k + 15], S14, 0x49B40821)

а = _GG(a, b, c, d, x[k + 1], S21, 0xF61E2562)

d = _GG(d, a, b, c, x[k + 6], S22, 0xC040B340)

c = _GG(c, d, a, b, x[k + 11], S23, 0x265E5A51)

b = _GG(b, c, d, a, x[k + 0], S24, 0xE9B6C7AA)

a = _GG(a, b, c, d, x[k + 5], S21, 0xD62F105D)

d = _GG(d, a, b, c, x[k + 10], S22, 0x2441453)

c = _GG(c, d, a, b, x[k + 15], S23, 0xD8A1E681)

b = _GG(b, c, d, a, x[k + 4], S24, 0xE7D3FBC8)

a = _GG(a, b, c, d, x[k + 9], S21, 0x21E1CDE6)

d = _GG(d, a, b, c, x[k + 14], S22, 0xC33707D6)

c = _GG(c, d, a, b, x[k + 3], S23, 0xF4D50D87)

b = _GG(b, c, d, a, x[k + 8], S24, 0x455A14ED)

a = _GG(a, b, c, d, x[k + 13], S21, 0xA9E3E905)

d = _GG(d, a, b, c, x[k + 2], S22, 0xFCEFA3F8)

c = _GG(c, d, a, b, x[k + 7], S23, 0x676F02D9)

b = _GG(b, c, d, a, x[k + 12], S24, 0x8D2A4C8A)

a = _HH(a, b, c, d, x[k + 5], S31, 0xFFFA3942)

d = _HH(d, a, b, c, x[k + 8], S32, 0x8771F681)

c = _HH(c, d, a, b, x[k + 11], S33, 0x6D9D6122)

b = _HH(b, c, d, a, x[k + 14], S34, 0xFDE5380C)

a = _HH(a, b, c, d, x[k + 1], S31, 0xA4BEEA44)

d = _HH(d, a, b, c, x[k + 4], S32, 0x4BDECFA9)

c = _HH(c, d, a, b, x[k + 7], S33, 0xF6BB4B60)

b = _HH(b, c, d, a, x[k + 10], S34, 0xBEBFBC70)

a = _HH(a, b, c, d, x[k + 13], S31, 0x289B7EC6)

d = _HH(d, a, b, c, x[k + 0], S32, 0xEAA127FA)

c = _HH(c, d, a, b, x[k + 3], S33, 0xD4EF3085)

b = _HH(b, c, d, a, x[k + 6], S34, 0x4881D05)

a = _HH(a, b, c, d, x[k + 9], S31, 0xD9D4D039)

d = _HH(d, a, b, c, x[k + 12], S32, 0xE6DB99E5)

c = _HH(c, d, a, b, x[k + 15], S33, 0x1FA27CF8)

b = _HH(b, c, d, a, x[k + 2], S34, 0xC4AC5665)

a = _II(a, b, c, d, x[k + 0], S41, 0xF4292244)

d = _II(d, a, b, c, x[k + 7], S42, 0x432AFF97)

c = _II(c, d, a, b, x[k + 14], S43, 0xAB9423A7)

b = _II(b, c, d, a, x[k + 5], S44, 0xFC93A039)

а = _II(а, б, в, г, х [к + 12], S41, 0x655B59C3)

d = _II(d, a, b, c, x[k + 3], S42, 0x8F0CCC92)

c = _II(c, d, a, b, x[k + 10], S43, 0xFFEFF47D)

b = _II(b, c, d, a, x[k + 1], S44, 0x85845DD1)

a = _II(a, b, c, d, x[k + 8], S41, 0x6FA87E4F)

d = _II(d, a, b, c, x[k + 15], S42, 0xFE2CE6E0)

c = _II(c, d, a, b, x[k + 6], S43, 0xA3014314)

b = _II(b, c, d, a, x[k + 13], S44, 0x4E0811A1)

a = _II(a, b, c, d, x[k + 4], S41, 0xF7537E82)

d = _II(d, a, b, c, x[k + 11], S42, 0xBD3AF235)

c = _II(c, d, a, b, x[k + 2], S43, 0x2AD7D2BB)

b = _II(b, c, d, a, x[k + 9], S44, 0xEB86D391)

a = _addUnsigned(a, AA)

b = _addUnsigned(b, BB)

c = _addUnsigned(c, CC)

d = _addUnsigned(d, DD)

= constTotemp(

2

) a) + _wordToHex(b) + _wordToHex(c) + _wordToHex(d)

return temp. toLowerCase()

}

Вы можете установить через npm install locutus и потребовать его через require('locutus/php/strings/md5') . Вам также может потребоваться модуль strings в полном объеме. чтобы вместо этого вы могли получить доступ к strings.md5 .

Если вы собираетесь настроить таргетинг на браузер, вы можете использовать сборщик модулей, например Посылка, вебпак, Просмотр или свернуть.js. Это может быть важно, поскольку Locutus позволяет использовать современный JavaScript в исходные файлы, что означает, что он может работать не во всех браузерах без шаг сборки/транспиляции. Locutus транспилирует все функции в ES5 перед публикацией в npm.

В отличие от Википедии, Locutus является постоянной работой сообщества. Наша философия следует Теория Макдональдса.