How to get an MD5 checksum in PowerShell

后端 未结 17 1562
夕颜
夕颜 2020-11-28 01:14

I would like to calculate an MD5 checksum of some content. How do I do this in PowerShell?

相关标签:
17条回答
  • 2020-11-28 01:21

    Another built-in command that's long been installed in Windows by default dating back to 2003 is Certutil, which of course can be invoked from PowerShell, too.

    CertUtil -hashfile file.foo MD5
    

    (Caveat: MD5 should be in all caps for maximum robustness)

    0 讨论(0)
  • 2020-11-28 01:21

    This site has an example: Using Powershell for MD5 Checksums. It uses the .NET framework to instantiate an instance of the MD5 hash algorithm to calculate the hash.

    Here's the code from the article, incorporating Stephen's comment:

    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()
    
    0 讨论(0)
  • 2020-11-28 01:22

    This is what I use to get a consistent hash value:

    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()
    }
    
    0 讨论(0)
  • 2020-11-28 01:24

    PowerShell One-Liners (string to hash)

    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("-","")
    
    0 讨论(0)
  • 2020-11-28 01:24

    This will return an MD5 hash for a file on a remote computer:

    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()
    }
    
    0 讨论(0)
  • 2020-11-28 01:24

    Here is a pretty print example attempting to verify the SHA256 fingerprint. I downloaded gpg4win v3.0.3 using PowerShell v4 (requires Get-FileHash).

    Download the package from https://www.gpg4win.org/download.html, open PowerShell, grab the hash from the download page, and run:

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

    Output:

    Hash matches for file gpg4win-3.0.3.exe
    
    0 讨论(0)
提交回复
热议问题