जवाबों:
यदि सामग्री एक स्ट्रिंग है:
$someString = "Hello, World!"
$md5 = New-Object -TypeName System.Security.Cryptography.MD5CryptoServiceProvider
$utf8 = New-Object -TypeName System.Text.UTF8Encoding
$hash = [System.BitConverter]::ToString($md5.ComputeHash($utf8.GetBytes($someString)))
यदि सामग्री एक फ़ाइल है:
$someFilePath = "C:\foo.txt"
$md5 = New-Object -TypeName System.Security.Cryptography.MD5CryptoServiceProvider
$hash = [System.BitConverter]::ToString($md5.ComputeHash([System.IO.File]::ReadAllBytes($someFilePath)))
PowerShell 4 संस्करण में शुरू, यह Get-FileHash
cmdlet के साथ बॉक्स से बाहर की फ़ाइलों के लिए करना आसान है :
Get-FileHash <filepath> -Algorithm MD5
यह निश्चित रूप से बेहतर है क्योंकि यह समस्याओं का पहला समाधान प्रदान करता है, जैसा कि टिप्पणियों में पहचाना गया है (एक स्ट्रीम का उपयोग करता है, इसे बंद करता है, और बड़ी फ़ाइलों का समर्थन करता है)।
Exception calling "ReadAllBytes" with "1" argument(s): "The file is too long. This operation is currently limited to supporting files less than 2 gigabytes in size."
Linux के Powershell के लिए नया आदमी होने के नाते, मैं उन संघर्षों से बहुत परेशान हूं, जिन्हें मैं md5 राशि प्राप्त कर रहा हूं, जो कि बस md5sum file.ext
लिनक्स पर होगा ।
$hash = [System.BitConverter]::ToString($md5.ComputeHash([System.IO.File]::Open("$someFilePath",[System.IO.Filemode]::Open, [System.IO.FileAccess]::Read)))
यह आपको कम मेमोरी उपयोग और कोई 2 जीबी सीमा नहीं देता है ।
$stream = [System.IO.File]::Open("$someFilePath",[System.IO.Filemode]::Open, [System.IO.FileAccess]::Read)
इसके $hash = [System.BitConverter]::ToString($md5.ComputeHash($stream))
बाद$stream.Close()
यदि आप PowerShell सामुदायिक एक्सटेंशन का उपयोग कर रहे हैं तो एक गेट-हैश कमांडलेट है जो यह आसानी से करेगा:
C:\PS> "hello world" | Get-Hash -Algorithm MD5
Algorithm: MD5
Path :
HashString : E42B054623B3799CB71F0883900F2764
Get-FileHash
वेनिला पॉवरशेल 4.0 में एक cmdlet जोड़ा है पैकेज का उपयोग नहीं कर सकते हैं या नहीं करेंगे । वीडियो टेकनेट ।
यहां दो लाइनें दी गई हैं, बस "हेल्लो" को लाइन # 2 में बदलें:
PS C:\> [Reflection.Assembly]::LoadWithPartialName("System.Web")
PS C:\> [System.Web.Security.FormsAuthentication]::HashPasswordForStoringInConfigFile("hello", "MD5")
यहाँ एक फ़ंक्शन है जिसका उपयोग मैं सापेक्ष और निरपेक्ष पथ को संभालता हूं:
function md5hash($path)
{
$fullPath = Resolve-Path $path
$md5 = new-object -TypeName System.Security.Cryptography.MD5CryptoServiceProvider
$file = [System.IO.File]::Open($fullPath,[System.IO.Filemode]::Open, [System.IO.FileAccess]::Read)
try {
[System.BitConverter]::ToString($md5.ComputeHash($file))
} finally {
$file.Dispose()
}
}
अंत में ब्लॉक का उपयोग करने के सुझाव के लिए ReadAllBytes () और @ jpmc26 के बजाय ओपन () का उपयोग करने के सुझाव के लिए @davor के लिए धन्यवाद।
Dispose
कॉल एक में होना चाहिए finally
ब्लॉक।
2003 में लंबे समय से डिफ़ॉल्ट रूप से विंडोज में स्थापित किया गया एक और निर्मित कमांड सर्टिफिल है , जो निश्चित रूप से पावरशेल से भी आमंत्रित किया जा सकता है।
CertUtil -hashfile file.foo MD5
(कैविएट: एमडी 5 अधिकतम मजबूती के लिए सभी कैप में होना चाहिए)
FipsAlgorithmPolicy
सक्षम होने पर यह एक अच्छा विकल्प है।
ComputeHash () का उपयोग करके ऑनलाइन बहुत सारे उदाहरण हैं। जब नेटवर्क कनेक्शन पर चल रहा था तो मेरा परीक्षण बहुत धीमा था। नीचे का स्निपेट मेरे लिए बहुत तेज़ चलता है, हालाँकि आपका माइलेज भिन्न हो सकता है:
$md5 = [System.Security.Cryptography.MD5]::Create("MD5")
$fd = [System.IO.File]::OpenRead($file)
$buf = New-Object byte[] (1024*1024*8) # 8 MB buffer
while (($read_len = $fd.Read($buf,0,$buf.length)) -eq $buf.length){
$total += $buf.length
$md5.TransformBlock($buf,$offset,$buf.length,$buf,$offset)
Write-Progress -Activity "Hashing File" `
-Status $file -percentComplete ($total/$fd.length * 100)
}
# Finalize the last read
$md5.TransformFinalBlock($buf, 0, $read_len)
$hash = $md5.Hash
# Convert hash bytes to a hexadecimal formatted string
$hash | foreach { $hash_txt += $_.ToString("x2") }
Write-Host $hash_txt
write-progress
लाइन पर बैकटिक क्या करता है? वाक्यविन्यास हाइलाइटर इसे पसंद नहीं करता है।
इस साइट का एक उदाहरण है: एमडी 5 चेकसम के लिए पॉवर्सशेल का उपयोग करना । यह हैश की गणना करने के लिए MD5 हैश एल्गोरिथ्म की एक आवृत्ति को तुरंत करने के लिए .NET फ्रेमवर्क का उपयोग करता है।
यहाँ लेख से कोड है, जिसमें स्टीफन की टिप्पणी शामिल है:
param
(
$file
)
$algo = [System.Security.Cryptography.HashAlgorithm]::Create("MD5")
$stream = New-Object System.IO.FileStream($Path, [System.IO.FileMode]::Open,
[System.IO.FileAccess]::Read)
$md5StringBuilder = New-Object System.Text.StringBuilder
$algo.ComputeHash($stream) | % { [void] $md5StringBuilder.Append($_.ToString("x2")) }
$md5StringBuilder.ToString()
$stream.Dispose()
जैसा कि स्वीकार किए गए उत्तर में कहा गया है, Get-FileHash
फाइलों के साथ उपयोग करना आसान है, लेकिन स्ट्रिंग्स के साथ इसका उपयोग करना भी संभव है:
$s = "asdf"
Get-FileHash -InputStream ([System.IO.MemoryStream]::New([System.Text.Encoding]::ASCII.GetBytes($s)))
अब एक Get-FileHash फ़ंक्शन है जो बहुत काम आता है।
PS C:\> Get-FileHash C:\Users\Andris\Downloads\Contoso8_1_ENT.iso -Algorithm SHA384 | Format-List
Algorithm : SHA384
Hash : 20AB1C2EE19FC96A7C66E33917D191A24E3CE9DAC99DB7C786ACCE31E559144FEAFC695C58E508E2EBBC9D3C96F21FA3
Path : C:\Users\Andris\Downloads\Contoso8_1_ENT.iso
बस SHA384
करने के लिए बदल जाते हैंMD5
।
इसका उदाहरण पॉवरशेल 5.1 के आधिकारिक दस्तावेज से है । प्रलेखन के और भी उदाहरण हैं।
यदि आप Microsoft से फ़ाइल चेकसम इंटीग्रिटी वेरिफ़ायर (FCIV) डाउनलोड करते हैं तो यह एक-लाइनर बन जाता है।
मैंने यहां से FCIV को डाउनलोड किया: फ़ाइल चेकसम इंटीग्रिटी वेरिफायर उपयोगिता की उपलब्धता और विवरण
निम्न आदेश चलाएँ। मेरे पास जांच के लिए दस फाइलें थीं।
Get-ChildItem WTAM*.tar | % {.\fciv $_.Name}
पॉवरशेल वन-लाइनर्स (स्ट्रिंग टू हैश)
MD5
([System.BitConverter]::ToString((New-Object -TypeName System.Security.Cryptography.MD5CryptoServiceProvider).ComputeHash((New-Object -TypeName System.Text.UTF8Encoding).GetBytes("Hello, World!")))).Replace("-","")
SHA1
([System.BitConverter]::ToString((New-Object -TypeName System.Security.Cryptography.SHA1CryptoServiceProvider).ComputeHash((New-Object -TypeName System.Text.UTF8Encoding).GetBytes("Hello, World!")))).Replace("-","")
SHA256
([System.BitConverter]::ToString((New-Object -TypeName System.Security.Cryptography.SHA256CryptoServiceProvider).ComputeHash((New-Object -TypeName System.Text.UTF8Encoding).GetBytes("Hello, World!")))).Replace("-","")
SHA384
([System.BitConverter]::ToString((New-Object -TypeName System.Security.Cryptography.SHA384CryptoServiceProvider).ComputeHash((New-Object -TypeName System.Text.UTF8Encoding).GetBytes("Hello, World!")))).Replace("-","")
SHA512
([System.BitConverter]::ToString((New-Object -TypeName System.Security.Cryptography.SHA512CryptoServiceProvider).ComputeHash((New-Object -TypeName System.Text.UTF8Encoding).GetBytes("Hello, World!")))).Replace("-","")
यह दूरस्थ कंप्यूटर पर फ़ाइल के लिए MD5 हैश लौटाएगा:
Invoke-Command -ComputerName RemoteComputerName -ScriptBlock {
$fullPath = Resolve-Path 'c:\Program Files\Internet Explorer\iexplore.exe'
$md5 = new-object -TypeName System.Security.Cryptography.MD5CryptoServiceProvider
$file = [System.IO.File]::OpenRead($fullPath)
$hash = [System.BitConverter]::ToString($md5.ComputeHash($file))
$hash -replace "-", ""
$file.Dispose()
}
यहाँ SHA256 फिंगरप्रिंट को सत्यापित करने का प्रयास एक सुंदर प्रिंट उदाहरण है। मैंने PowerShell v4 (आवश्यकता Get-FileHash
) का उपयोग करके gpg4win v3.0.3 डाउनलोड किया ।
Https://www.gpg4win.org/download.html से पैकेज डाउनलोड करें , PowerShell खोलें, डाउनलोड पृष्ठ से हैश को पकड़ो और चलाएं:
cd ${env:USERPROFILE}\Downloads
$file = "gpg4win-3.0.3.exe"
# Set $hash to the hash reference from the download page:
$hash = "477f56212ee60cc74e0c5e5cc526cec52a069abff485c89c2d57d1b4b6a54971"
# If you have an MD5 hash: # $hashAlgo="MD5"
$hashAlgo = "SHA256"
$computed_hash = (Get-FileHash -Algorithm $hashAlgo $file).Hash.ToUpper()
if ($computed_hash.CompareTo($hash.ToUpper()) -eq 0 ) {
Write-Output "Hash matches for file $file"
}
else {
Write-Output ("Hash DOES NOT match for file {0}: `nOriginal hash: {1} `nComputed hash: {2}" -f ($file, $hash.ToUpper(), $computed_hash))
}
आउटपुट:
Hash matches for file gpg4win-3.0.3.exe
यहाँ एक लाइन-कमांड उदाहरण है, जिसमें फ़ाइल की उचित जांच की गणना की जाती है , जैसे कि आपने अभी डाउनलोड किया है, और मूल के प्रकाशित चेकसम के साथ तुलना कर रहा है।
उदाहरण के लिए, मैंने एक उदाहरण लिखा था Apache JMeter परियोजना से डाउनलोडिंग के । इस मामले में आपके पास:
3a84491f10fb7b147101cf3926c4a855 * apache-jmeter-4.0.zip
फिर इस PowerShell कमांड का उपयोग करके, आप डाउनलोड की गई फ़ाइल की अखंडता को सत्यापित कर सकते हैं:
PS C:\Distr> (Get-FileHash .\apache-jmeter-4.0.zip -Algorithm MD5).Hash -eq (Get-Content .\apache-jmeter-4.0.zip.md5 | Convert-String -Example "hash path=hash")
आउटपुट:
True
स्पष्टीकरण:
-eq
ऑपरेटर का पहला ऑपरेशन फ़ाइल के लिए चेकसम की गणना करने का एक परिणाम है:
(Get-FileHash .\apache-jmeter-4.0.zip -Algorithm MD5).Hash
दूसरा ऑपरेंड प्रकाशित चेकसम मान है। हम सबसे पहले file.md5 की सामग्री प्राप्त करते हैं जो एक स्ट्रिंग है और फिर हम स्ट्रिंग प्रारूप के आधार पर हैश मान निकालते हैं:
Get-Content .\apache-jmeter-4.0.zip.md5 | Convert-String -Example "hash path=hash"
फ़ाइल और file.md5 दोनों इस कमांड कार्य के लिए एक ही फ़ोल्डर में होने चाहिए।
यह वह है जो मैं एक सुसंगत हैश मान प्राप्त करने के लिए उपयोग करता हूं:
function New-CrcTable {
[uint32]$c = $null
$crcTable = New-Object 'System.Uint32[]' 256
for ($n = 0; $n -lt 256; $n++) {
$c = [uint32]$n
for ($k = 0; $k -lt 8; $k++) {
if ($c -band 1) {
$c = (0xEDB88320 -bxor ($c -shr 1))
}
else {
$c = ($c -shr 1)
}
}
$crcTable[$n] = $c
}
Write-Output $crcTable
}
function Update-Crc ([uint32]$crc, [byte[]]$buffer, [int]$length, $crcTable) {
[uint32]$c = $crc
for ($n = 0; $n -lt $length; $n++) {
$c = ($crcTable[($c -bxor $buffer[$n]) -band 0xFF]) -bxor ($c -shr 8)
}
Write-Output $c
}
function Get-CRC32 {
<#
.SYNOPSIS
Calculate CRC.
.DESCRIPTION
This function calculates the CRC of the input data using the CRC32 algorithm.
.EXAMPLE
Get-CRC32 $data
.EXAMPLE
$data | Get-CRC32
.NOTES
C to PowerShell conversion based on code in https://www.w3.org/TR/PNG/#D-CRCAppendix
Author: Øyvind Kallstad
Date: 06.02.2017
Version: 1.0
.INPUTS
byte[]
.OUTPUTS
uint32
.LINK
https://communary.net/
.LINK
https://www.w3.org/TR/PNG/#D-CRCAppendix
#>
[CmdletBinding()]
param (
# Array of Bytes to use for CRC calculation
[Parameter(Position = 0, ValueFromPipeline = $true)]
[ValidateNotNullOrEmpty()]
[byte[]]$InputObject
)
$dataArray = @()
$crcTable = New-CrcTable
foreach ($item in $InputObject) {
$dataArray += $item
}
$inputLength = $dataArray.Length
Write-Output ((Update-Crc -crc 0xffffffffL -buffer $dataArray -length $inputLength -crcTable $crcTable) -bxor 0xffffffffL)
}
function GetHash() {
[CmdletBinding()]
param(
[Parameter(Position = 0, ValueFromPipeline = $true)]
[ValidateNotNullOrEmpty()]
[string]$InputString
)
$bytes = [System.Text.Encoding]::UTF8.GetBytes($InputString)
$hasCode = Get-CRC32 $bytes
$hex = "{0:x}" -f $hasCode
return $hex
}
function Get-FolderHash {
[CmdletBinding()]
param(
[Parameter(Position = 0, ValueFromPipeline = $true)]
[ValidateNotNullOrEmpty()]
[string]$FolderPath
)
$FolderContent = New-Object System.Collections.ArrayList
Get-ChildItem $FolderPath -Recurse | Where-Object {
if ([System.IO.File]::Exists($_)) {
$FolderContent.AddRange([System.IO.File]::ReadAllBytes($_)) | Out-Null
}
}
$hasCode = Get-CRC32 $FolderContent
$hex = "{0:x}" -f $hasCode
return $hex.Substring(0, 8).ToLower()
}
यहाँ स्निपेट है जिसका उपयोग मैं एमडी 5 को दिए गए स्ट्रिंग के लिए कर रहा हूँ:
$text = "text goes here..."
$md5 = [Security.Cryptography.MD5CryptoServiceProvider]::new()
$utf8 = [Text.UTF8Encoding]::UTF8
$bytes= $md5.ComputeHash($utf8.GetBytes($text))
$hash = [string]::Concat($bytes.foreach{$_.ToString("x2")})