PowerShell में MD5 चेकसम कैसे प्राप्त करें


179

मैं कुछ सामग्री के एमडी 5 चेकसम की गणना करना चाहूंगा । मैं इसे PowerShell में कैसे करूं?


3
"कुछ सामग्री" क्या है? एक पंक्ति? स्ट्रिंग?
vcsjones

जवाबों:


326

यदि सामग्री एक स्ट्रिंग है:

$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-FileHashcmdlet के साथ बॉक्स से बाहर की फ़ाइलों के लिए करना आसान है :

Get-FileHash <filepath> -Algorithm MD5

यह निश्चित रूप से बेहतर है क्योंकि यह समस्याओं का पहला समाधान प्रदान करता है, जैसा कि टिप्पणियों में पहचाना गया है (एक स्ट्रीम का उपयोग करता है, इसे बंद करता है, और बड़ी फ़ाइलों का समर्थन करता है)।


12
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लिनक्स पर होगा ।
StockB

@StockB कीथ का जवाब शायद यही बेहतर है। मैं मानता हूं, कुछ शक्तियां हैं जिनमें शक्तियां हैं।
vcsjones

5
मेरे पास वेनिला पॉवरशेल है, जिसमें कोई एक्सटेंशन नहीं है, इसलिए मैं टूट गया और इसके बजाय एक कमांड-लाइन md5sum क्लोन डाउनलोड किया, जो बहुत अच्छा काम करता है। मैं Microsoft का सामान पसंद करना चाहता हूं, लेकिन मैं अभी नहीं कर सकता।
स्टॉकब

23
@StockB vcsjones की विधि बफ़र्ड नहीं है ... = बड़ी फ़ाइलों की मांग करने वाली बहुत मेमोरी। मेरा सुझाव है कि आप धाराओं के साथ काम करें: $hash = [System.BitConverter]::ToString($md5.ComputeHash([System.IO.File]::Open("$someFilePath",[System.IO.Filemode]::Open, [System.IO.FileAccess]::Read)))यह आपको कम मेमोरी उपयोग और कोई 2 जीबी सीमा नहीं देता है
जोसफोविक

20
@ समय की अनिश्चित अवधि के लिए स्ट्रीम को खुला रखता है, इसलिए आप फ़ाइल को तब तक नहीं हटा सकते जब तक Powershell बंद न हो। $stream = [System.IO.File]::Open("$someFilePath",[System.IO.Filemode]::Open, [System.IO.FileAccess]::Read)इसके $hash = [System.BitConverter]::ToString($md5.ComputeHash($stream))बाद$stream.Close()
जोए एंथम

57

यदि आप PowerShell सामुदायिक एक्सटेंशन का उपयोग कर रहे हैं तो एक गेट-हैश कमांडलेट है जो यह आसानी से करेगा:

C:\PS> "hello world" | Get-Hash -Algorithm MD5


Algorithm: MD5


Path       :
HashString : E42B054623B3799CB71F0883900F2764

10
गेट-हैश पॉवरशेल सामुदायिक एक्सटेंशन से आता है। जब आप Get-FileHashवेनिला पॉवरशेल 4.0 में एक cmdlet जोड़ा है पैकेज का उपयोग नहीं कर सकते हैं या नहीं करेंगे । वीडियो टेकनेट
टॉमाज़ कुडज़ीलो

ध्यान दें कि यह (और शायद सबसे अधिक पीएस समाधान) स्ट्रिंग को UTF-16 (छोटे-एंडियन?) के रूप में एन्कोड करता है।
क्रिश्चियन मान

PowerShell सामुदायिक एक्सटेंशन का लिंक कोडप्लेक्स संग्रह (कोडप्लेक्स 2017 में बंद हो गया) पर रीडायरेक्ट करता है। शायद GitHub एक में बदल सकते हैं ? (GitHub पर नया मास्टर स्थान है?)
पीटर मॉर्टेंसन

16

यहां दो लाइनें दी गई हैं, बस "हेल्लो" को लाइन # 2 में बदलें:

PS C:\> [Reflection.Assembly]::LoadWithPartialName("System.Web")
PS C:\> [System.Web.Security.FormsAuthentication]::HashPasswordForStoringInConfigFile("hello", "MD5")

1
इसका परिणाम स्वीकृत उत्तर के साथ मुझे प्राप्त आउटपुट के बराबर नहीं है। यह STRING "हेलो" के हैश की गणना करता है, किसी FILE की नहीं, जिसे मैं "हैलो" से बदलने वाले किसी भी रास्ते से परिभाषित करूं, सही?
रॉबर्टजी

1
यह सच है, लेकिन ओपी ने एक फाइल नहीं मांगी, और मैं यहां स्ट्रिंग समाधान की तलाश में आया था
क्रिस एफ कैरोल

16

यहाँ एक फ़ंक्शन है जिसका उपयोग मैं सापेक्ष और निरपेक्ष पथ को संभालता हूं:

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 के लिए धन्यवाद।


2
यह दृष्टिकोण vcsjones 'और कीथ की तुलना में बेहतर IMHO है क्योंकि यह 2GB से बड़ी फ़ाइलों का इनपुट ले सकता है और इसके लिए किसी एक्सटेंशन या PowerShell 4.0 की आवश्यकता नहीं है।
चिराग भाटिया

1
Disposeकॉल एक में होना चाहिए finallyब्लॉक।
jpmc26

12

2003 में लंबे समय से डिफ़ॉल्ट रूप से विंडोज में स्थापित किया गया एक और निर्मित कमांड सर्टिफिल है , जो निश्चित रूप से पावरशेल से भी आमंत्रित किया जा सकता है।

CertUtil -hashfile file.foo MD5

(कैविएट: एमडी 5 अधिकतम मजबूती के लिए सभी कैप में होना चाहिए)


1
FipsAlgorithmPolicyसक्षम होने पर यह एक अच्छा विकल्प है।
विलियम जॉन होल्डन

9

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

1
आप अन्य उत्तरों से ReadAllBytes की 2Gb सीमा को पार कर लेते हैं, जो कि वास्तव में मेरी आवश्यकता है।
जय

write-progressलाइन पर बैकटिक क्या करता है? वाक्यविन्यास हाइलाइटर इसे पसंद नहीं करता है।
mwfearnley

1
@mwfearnley बैकटिक लाइन निरंतरता को सक्षम करता है। blogs.technet.microsoft.com/heyscriptingguy/2015/06/19/…
cmcginty

6

इस साइट का एक उदाहरण है: एमडी 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()

1
इसके अलावा अच्छा यह आसानी से फ़ाइलों के लिए काम नहीं करता है! इसे $ स्ट्रीम = New-Object System.IO.FileStream ($ Path, [System.IO.FileMode] :: Open, [System.IO.FileAccess] :: Read)
स्टीफन कोनोली

1
यदि लिंक कभी मर जाता है, तो उत्तर काफी बेकार होगा। stackoverflow.com/help/how-to-answer
मैं मोनिका

1
मैंने जो अनुमान लगाया था, उसके जवाब में, मैंने यहां लेख से कोड को काट दिया और चिपका दिया। मैंने पिछले साल ऐसा नहीं किया, क्योंकि मुझे लगा कि यह साहित्यिक चोरी है। स्टीफन के केवल पढ़ने के अनुकूलन को जोड़ने से मुझे लगा कि यह पोस्ट करने लायक है।
नेपोनपिर

@neontapir बस कहने के लिए: कुछ शब्दशः (या अनुकूलन के साथ) पोस्ट करना केवल साहित्यिक चोरी है यदि आप स्रोत को स्वीकार नहीं करते हैं। कॉपीराइट (कानूनी रूप से या नैतिक रूप से) एक अलग मुद्दा है, लेकिन मैं ज्यादातर कोड स्निपेट के साथ इसके बारे में चिंता नहीं करूंगा।
mwfearnley

6

जैसा कि स्वीकार किए गए उत्तर में कहा गया है, Get-FileHashफाइलों के साथ उपयोग करना आसान है, लेकिन स्ट्रिंग्स के साथ इसका उपयोग करना भी संभव है:

$s = "asdf"
Get-FileHash -InputStream ([System.IO.MemoryStream]::New([System.Text.Encoding]::ASCII.GetBytes($s)))

5

अब एक 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 के आधिकारिक दस्तावेज से है । प्रलेखन के और भी उदाहरण हैं।


3

यदि आप Microsoft से फ़ाइल चेकसम इंटीग्रिटी वेरिफ़ायर (FCIV) डाउनलोड करते हैं तो यह एक-लाइनर बन जाता है।

मैंने यहां से FCIV को डाउनलोड किया: फ़ाइल चेकसम इंटीग्रिटी वेरिफायर उपयोगिता की उपलब्धता और विवरण

निम्न आदेश चलाएँ। मेरे पास जांच के लिए दस फाइलें थीं।

Get-ChildItem WTAM*.tar | % {.\fciv $_.Name}

3

पॉवरशेल वन-लाइनर्स (स्ट्रिंग टू हैश)

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("-","")

1

यह दूरस्थ कंप्यूटर पर फ़ाइल के लिए 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()
}

1

राइट-क्लिक मेनू विकल्प के लिए भी नमूना:

[HKEY_CLASSES_ROOT\*\shell\SHA1 PS check\command]
@="C:\\Windows\\system32\\WindowsPowerShell\\v1.0\\powershell.exe -NoExit -Command Get-FileHash -Algorithm SHA1 '%1'"

0

यहाँ 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

0

यहाँ एक लाइन-कमांड उदाहरण है, जिसमें फ़ाइल की उचित जांच की गणना की जाती है , जैसे कि आपने अभी डाउनलोड किया है, और मूल के प्रकाशित चेकसम के साथ तुलना कर रहा है।

उदाहरण के लिए, मैंने एक उदाहरण लिखा था Apache JMeter परियोजना से डाउनलोडिंग के । इस मामले में आपके पास:

  1. डाउनलोड बाइनरी फ़ाइल
  2. मूल का चेकसम जो प्रारूप में एक स्ट्रिंग के रूप में file.md5 में प्रकाशित किया गया है:

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 दोनों इस कमांड कार्य के लिए एक ही फ़ोल्डर में होने चाहिए।


0

यह वह है जो मैं एक सुसंगत हैश मान प्राप्त करने के लिए उपयोग करता हूं:

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()
}

आपने PowerShell कोड कहां से कॉपी किया है? https://communary.net/ ?
पीटर मॉर्टेंसन

0

यहाँ स्निपेट है जिसका उपयोग मैं एमडी 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")}) 
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.