Сегодня получил в почту письмо с вопросом про получение 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, чтобы оно было доступно для всех файлов в файловой системе









7.8.2008 в 12:07
Большое спасибо за помощь.
7.8.2008 в 12:23
Не за что
8.8.2008 в 9:41
можно добавить, что с минимальными переделками кода можно получать не только MD5, но и SHA1 и т.д.