Get-MD5 (из строки)

Сегодня получил в почту письмо с вопросом про получение MD5, цитирую кусочек:

Хочу задать вопрос по поводу вычисления md5 строки. Вся информация что есть в доступе касается вычисления md5 файлов, но обычной функции, аргумент которой — любой текст нет.

Итак, делаем функцию для получения хэша MD5 из текстовой строки. За основу берем вот эту, которая получает хэш из файла. Так как FileStream у нас не будет, стоит посмотреть какие еще типы объектов готов принять метод ComputeHash. Для того чтобы это узнать, выполняем следующий код:

[PS <41> C:\Root] $cryptoServiceProvider = [System.Security.Cryptography.MD5CryptoServiceProvider];
[PS <42> C:\Root] $hashAlgorithm = new-object $cryptoServiceProvider
[PS <43> C:\Root] $hashAlgorithm.ComputeHash

MemberType          : Method
OverloadDefinitions : {System.Byte[] ComputeHash(Stream inputStream), System.Byte[] ComputeHash(Byte
                      [] buffer), System.Byte[] ComputeHash(Byte[] buffer, Int32 offset, Int32 count
                      )}
TypeNameOfValue     : System.Management.Automation.PSMethod
Value               : System.Byte[] ComputeHash(Stream inputStream), System.Byte[] ComputeHash(Byte[
                      ] buffer), System.Byte[] ComputeHash(Byte[] buffer, Int32 offset, Int32 count)
Name                : ComputeHash
IsInstance          : True

Как можно заметить, после .ComputeHash не стоят скобки (), и поэтому PowerShell выводит «синтаксис» этого метода — OverloadDefinitions. Overload Definitions — это наборы принимаемых методом аргументов. В данном случае нам подойдет следующий набор:

System.Byte[] ComputeHash(Byte[] buffer)

Он принимает на вход массив байтов (Byte[] buffer), и возвращает массив байтов с хэшем (System.Byte[]).

Ну и превратить массив байтов в строку можно с помощью метода [System.Text.Encoding]::Default.GetBytes($строка). Итак, объединяем всё вместе:

function Get-MD5([string]$Content)
{
	$cryptoServiceProvider = [System.Security.Cryptography.MD5CryptoServiceProvider];
	$hashAlgorithm = new-object $cryptoServiceProvider
	$bytes = [System.Text.Encoding]::Default.GetBytes($Content)
	$hashByteArray = $hashAlgorithm.ComputeHash($bytes);
	$formattedHash = [string]::join(" ",($hashByteArray | foreach {$_.tostring("X2")}))
	return $formattedHash;
}

В предпоследней строке я еще отформатировал полученный хэш (представляющий из себя массив байтов), в традиционный вид. Ну и пример применения :)

[PS <53> C:\Root] Get-MD5 "Windows PowerShell"
BF 44 8B 76 D1 14 22 F4 A5 18 BE C2 0E B4 79 37

Кстати вот здесь я описывал как можно «прикрепить» динамическое свойстов md5 к классу System.IO.FileInfo, чтобы оно было доступно для всех файлов в файловой системе :)

About these ads
Опубликовано в Learn, PowerShell, Scripting, Tips. 3 Comments »

Комментариев: 3 to “Get-MD5 (из строки)”

  1. Naum Says:

    Большое спасибо за помощь.

  2. Xaegr Says:

    Не за что :)

  3. Camelot Says:

    можно добавить, что с минимальными переделками кода можно получать не только MD5, но и SHA1 и т.д. :)


Обсуждение закрыто.

Отслеживать

Get every new post delivered to your Inbox.

Join 39 other followers

%d bloggers like this: