উত্তর:
যদি সামগ্রীটি একটি স্ট্রিং থাকে:
$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)))
পাওয়ারশেল সংস্করণ 4-এ শুরু করে, বক্সের বাইরে ফাইলগুলি Get-FileHash
সেমিডিলেট দিয়ে করা সহজ:
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."
পাওয়ারশেলের কাছে নতুন একজন লিনাক্স লোক হিসাবে, আমি একটি এমডি 5 যোগফল পাচ্ছি এমন লড়াইগুলি নিয়ে আমি খুব বিরক্ত, যা কেবল 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()
আপনি যদি পাওয়ারশেল সম্প্রদায় এক্সটেনশনগুলি ব্যবহার করেন তবে একটি গেট-হ্যাশ কমান্ডলেট রয়েছে যা এটি সহজেই এটি করতে পারে:
C:\PS> "hello world" | Get-Hash -Algorithm MD5
Algorithm: MD5
Path :
HashString : E42B054623B3799CB71F0883900F2764
Get-FileHash
ভ্যানিলা পাওয়ারশেল ৪.০ এ একটি সেমিডলেট যুক্ত করেছেন । ভিডি টেকনেট ।
এখানে দুটি লাইন রয়েছে, কেবল # 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 () এর পরিবর্তে ওপেন () ব্যবহার করার পরামর্শের জন্য উপরের @ বিজ্ঞাপনকে ধন্যবাদ এবং ধন্যবাদ
Dispose
কলের জন্য একটি হওয়া উচিত finally
ব্লক।
উইন্ডোতে 2003 সালের পূর্বনির্ধারিত ডিফল্টরূপে আরও একটি বিল্ট-ইন কমান্ড হ'ল সার্টুইটিল , অবশ্যই পাওয়ারশেল থেকেও অনুরোধ করা যেতে পারে।
CertUtil -hashfile file.foo MD5
(ক্যাভিয়েট: এমডি 5 সর্বাধিক দৃ all়তার জন্য সমস্ত ক্যাপের মধ্যে থাকা উচিত)
FipsAlgorithmPolicy
সক্ষম করা হলে এটি একটি ভাল বিকল্প ।
কমপিউটহ্যাশ () ব্যবহার করে অনলাইনে প্রচুর উদাহরণ রয়েছে। কোনও নেটওয়ার্ক সংযোগে চলার সময় আমার পরীক্ষাটি দেখায় যে এটি খুব ধীর ছিল। নীচের স্নিপেটটি আমার জন্য আরও দ্রুত চলে, তবে আপনার মাইলেজটি বিভিন্ন রকম হতে পারে:
$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
লাইনের ব্যাকটিকটি কী করে ? সিনট্যাক্স হাইলাইটারটি এটি পছন্দ করছে বলে মনে হয় না।
এই সাইটের উদাহরণ রয়েছে: MD5 চেকসামগুলির জন্য পাওয়ারশেল ব্যবহার করা । এটি হ্যাশ গণনা করার জন্য 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)))
এখন একটি গেট-ফাইলহ্যাশ ফাংশন রয়েছে যা খুব সহজ।
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 এর অফিসিয়াল ডকুমেন্টেশন থেকে । ডকুমেন্টেশনের আরও উদাহরণ রয়েছে।
আপনি যদি মাইক্রোসফ্ট থেকে ফাইল চেকসাম ইন্টিগ্রিটি ভেরিফায়ার (এফসিআইভি) ডাউনলোড করেন তবে এটি ওয়ান-লাইনারে পরিণত হয়।
আমি এখান থেকে এফসিআইভি ডাউনলোড করেছি: ফাইল চেকসাম ইন্টিগ্রিটি ভেরিফায়ার ইউটিলিটির উপলভ্যতা এবং বিবরণ
নিম্নলিখিত কমান্ড চালান। আমার কাছে পরীক্ষা করার জন্য দশটি ফাইল ছিল।
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 ফিঙ্গারপ্রিন্ট যাচাই করার চেষ্টা করার একটি দুর্দান্ত মুদ্রণের উদাহরণ রয়েছে। আমি পাওয়ারশেল ভি 4 ব্যবহার করে জিপিজি 4উইন v3.0.3 ডাউনলোড করেছি (প্রয়োজনীয় Get-FileHash
)।
Https://www.gpg4win.org/download.html থেকে প্যাকেজটি ডাউনলোড করুন , পাওয়ারশেল খুলুন, ডাউনলোড পৃষ্ঠা থেকে হ্যাশটি ধরুন এবং চালান:
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
ফাইলের যথাযথ চেকসাম উভয়কেই কম্পিউটিংয়ের সাথে এখানে একটি লাইন-কমান্ডের উদাহরণ রয়েছেআপনি যেমন ডাউনলোড করেছেন কেবল যেমন এবং এটির মূল প্রকাশিত চেকসামের সাথে তুলনা করে ।
উদাহরণস্বরূপ, আমি অ্যাপাচি জেমেটার প্রকল্প থেকে ডাউনলোড করার জন্য একটি উদাহরণ লিখেছি । এক্ষেত্রে আপনার রয়েছে:
3a84491f10fb7b147101cf3926c4a855 * অ্যাপাচি- জমিটার 4.0.zip
তারপরে এই পাওয়ারশেল কমান্ডটি ব্যবহার করে আপনি ডাউনলোড করা ফাইলটির অখণ্ডতা যাচাই করতে পারবেন:
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
দ্বিতীয় অপারেন্ড হ'ল প্রকাশিত চেকসাম মান। আমরা প্রথমে ফাইল.এমডি 5 এর সামগ্রী পাই যা একটি স্ট্রিং এবং তারপরে আমরা স্ট্রিং বিন্যাসের ভিত্তিতে হ্যাশ মানটি বের করি:
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")})