[powershell] PowerShell에서 MD5 체크섬을 얻는 방법

일부 내용 의 MD5 체크섬 을 계산하고 싶습니다 . PowerShell에서 어떻게해야합니까?



답변

내용이 문자열 인 경우 :

$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

이것은 주석에서 식별 된 첫 번째 솔루션이 제공하는 문제 (스트림 사용, 닫기 및 대용량 파일 지원)를 피하기 때문에 확실히 바람직합니다.


답변

PowerShell 커뮤니티 확장을 사용하는 경우 이를 쉽게 수행 할 수있는 Get-Hash 커맨드 렛이 있습니다.

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


Algorithm: MD5


Path       :
HashString : E42B054623B3799CB71F0883900F2764


답변

다음은 두 줄입니다. 2 번 줄에서 “hello”를 변경하십시오.

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

위의 @davor 덕분에 ReadAllBytes () 대신 Open ()을 사용하고 finally 블록을 사용하는 제안에 @ jpmc26을 제안했습니다.


답변

2003 년으로 거슬러 올라간 기본적으로 Windows에 오랫동안 설치되어 온 또 다른 기본 제공 명령은 Certutil 이며 물론 PowerShell에서도 호출 할 수 있습니다.

CertUtil -hashfile file.foo MD5

(주의 : MD5는 최대한의 견고성을 위해 모든 캡에 있어야합니다)


답변

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


답변

이 사이트의 예는 다음과 같습니다. MD5 체크섬에 Powershell 사용 있습니다. .NET 프레임 워크를 사용하여 MD5 해시 알고리즘의 인스턴스를 인스턴스화하여 해시를 계산합니다.

다음은 Stephen의 의견을 통합 한 기사의 코드입니다.

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