일부 내용 의 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-FileHash
cmdlet 을 사용하여 즉시 사용 가능한 파일을 쉽게 수행 할 수 있습니다 .
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()