Get-FileHash PowerShell Cmdlet'i Nasıl Kullanılır
İki dosyayı karşılaştırmanız veya bir dosyanın değişmediğinden emin olmanız mı gerekiyor? PowerShell cmdlet'i Get-FileHash, hem dosyalar hem de veri akışları için karma değerler üretir. Hash, bir değeri diğerine dönüştüren bir fonksiyondur. Bazen karma değeri, yerden tasarruf etmek için daha küçük olabilir veya karma değeri, bir dosyayı doğrulamak için kullanılan bir sağlama toplamı olabilir.
Bu makalede, Get-FileHash'ı kullanmanın birkaç yolunun yanı sıra karma oluşturma geçmişi ve en iyi güvenlik uygulamaları hakkında daha fazla ayrıntı öğreneceksiniz!
Önkoşullar
Hem Windows PowerShell'i hem de PowerShell Core'u içeren 4'ten büyük herhangi bir PowerShell sürümü.
Haş nedir?
Bir parça veriyi veya dosyayı temsil eden basit bir değer yaratabilseydiniz ne olurdu? Karma değer veya dijital imza, iki veri kümesini karşılaştırmanıza olanak tanır. Aynı girdi her zaman aynı çıktıyı yaratacağından karmalar tutarlı ve işlevsel olarak kabul edilir.
Bu nedenle, girdideki tek bir karakter bile değiştirilse karma farklı olacaktır. Karma değerleri, karma değerini hesaplama yöntemi olan belirli bir karma algoritması kullanılarak hesaplanır.
Her karma algoritmasının çok uygun olduğu belirli durumları vardır. Çoğu zaman hız ve güvenlik arasında bir denge vardır. MD5 gibi bir algoritma hızlıdır ancak daha az karmaşık karma değerlerine sahiptir. Öte yandan, SHA512 daha karmaşık karmalar üretir ancak genel olarak daha yavaştır.
Güvenlik önlemleri açısından MD5 genellikle önerilmez. Bunun yerine SHA512'yi kullanmayı deneyin.
Karma işleminin önemli bir kullanım alanı da verileri imzalamaktır. Bazen iki farklı girdi aynı çıktı karmasını üretebilir. Buna hash çarpışması denir. Herhangi biri belirli bir algoritma için öngörülebilir şekilde karma çarpışmalar oluşturabildiğinde, bu algoritmanın daha az güvenli veya "bozuk" olduğu kabul edilir.
PowerShell'in Get-FileHash cmdlet'i aşağıda listelenen çeşitli algoritmaları destekler.
- PowerShell Core (sürüm 6 ve 7):
MD5,SHA1,SHA256,SHA384veSHA512 - Windows PowerShell (sürüm 4 - 5.1):
MACTripleDES,MD5,RIPEMD160,SHA1,SHA256,SHA384veSHA512
Tek Bir Dosya İçin Karma Değer Hesaplama
Get-FileHash cmdlet'ine aşina olmak için aşağıdaki örnekte görüldüğü gibi komuta tek bir dosya iletin.
Get-FileHash C:\Windows\write.exeGet-FileHash aşağıda gösterildiği gibi kullanılan algoritmayı, dosyanın karma değerini ve belirttiğiniz dosyanın tam yolunu verecektir. Başka bir algoritma belirtilmemişse, PowerShell'in tüm sürümleri için varsayılan değer SHA256'dır.
Bir Dizindeki Dosyalar İçin Hash Değerlerini Hesaplama
Bir dizindeki her dosya için karma değerler oluşturmak için Yol parametresinde joker karakterler (*) kullanın. Hiçbir algoritmanın belirtilmediğini fark edebilirsiniz.
Aşağıdaki komutu kopyalayın ve C:\ dizinindeki tüm yürütülebilir dosyalar için SHA256 karma değerleri oluşturmak üzere kök C:\ dizininden çalıştırın.
# The example below computes the hashes relative to the current directory
# notated by the "." before the "\".
Get-FileHash .\Windows\*.exeTüm Dosyalar için Tekrarlı Olarak Karma Değerler Oluştur
Bir dizindeki ve onun alt dizinlerindeki tüm dosyalara karma oluşturmak için, öğeleri Get-ChildItem yoluyla yinelemeli olarak listeleyin ve sonuçları Get-FileHash'a iletin. Get-FileHash ile joker karakter kullanabilseniz de bu, her alt dizinde yinelemeli olarak geçiş yapmaz.
Get-ChildItem -Path C:\py* -Recurse -Filter *.exe | Get-FileHashHesaplanan Özellik Aracılığıyla Get-ChildItem Çıktısına Dosya Karması Ekleme
Get-FileHash tek başına sınırlı çıktıya sahiptir. Get-ChildItem ile birlikte kullanıldığında çıktıda birçok dosya özelliği kaybolur. Dosya bilgilerini saklamak için, dosya karmasını dinamik olarak eklemek üzere bir hesaplanmış özellik oluşturun.
Aşağıdaki örnek, windows-version.txt örnek dosyasını okur ve Get-ChildItem<'den yalnızca hesaplanan özelliğini ekler.Ad ve Length özelliğini seçer. /code> çıktısını alır ve Hash
Select-Object uses a hashtable to create a calculated property. Define a "Name" and an
"Expression", which operates on the current object in the pipeline.
Get-ChildItem .\windows-version.txt |
Select-Object -Property Name,Length,
@{name="Hash";expression={(Get-FileHash $_.FullName).hash}}Karma Kullanarak İki Dizindeki Tüm Dosyaları Karşılaştırma
İki klasörünüz olduğunu ve hangi dosyaların farklı olduğunu bulmanız gerektiğini varsayalım. Her dosya için Get-FileHash ile bir karma oluşturup ardından bunları karşılaştırarak bu klasörlerdeki tüm dosyaları karşılaştırabilirsiniz.
Hesaplanan özellikler ve Get-FileHash ile öğrendiklerinizi temel alan Compare-Object cmdlet'i, her dosya için hesaplanan karma değerini karşılaştırır ve herhangi bir çıktıyı verir. farklılıklar.
İlk olarak, Compare-Object ile kullanılmak üzere bir dizi yürütülebilir dosyayı ve hesaplanan karmaları alın.
# Retrieve all executables directly located within the C:\Windows directory and compute a hash value for each.
$WindowsExesOnly = Get-ChildItem C:\Windows\*.exe |
Select-Object -Property *,
@{name="Hash";expression={(Get-FileHash $_.FullName -Algorithm MD5).hash}}
# Retrieve all executables located in any directory from the C:\ drive, but not recursively, and compute a hash value for each.
$SecondLevelExes = Get-ChildItem C:\*\*.exe |
Select-Object -Property *,
@{name="Hash";expression={(Get-FileHash $_.FullName -Algorithm MD5).hash}}Daha sonra, elde edilen dosya nesnesi dizilerini ($WindowsExesOnly ve $SecondLevelExes) ReferenceObject kullanarak Compare-Object'e sağlayın. ve DifferenceObject parametreleri. Aşağıdaki kodu çalıştırın ve Compare-Object ile karşılaştırmak için hem Ad hem de Hash özelliklerini iletin. Hem Ad hem de Hash özelliklerinin kullanılması aynı dosyalara ancak farklı dosya adlarına sahip olmanıza olanak tanır.
Compare-Object -Ref $WindowsExesOnly -Dif $SecondLevelExes -Property Name,Hash
Compare-Object çıktısı, özdeş olmayan dosyaların hangi dizide bulunduğunu belirten SideIndicator özelliğini gösterir. Aşağıda gösterildiği gibi, 'de altı benzersiz dosya bulunur. $SecondLevelExes dizisi.
Benzersiz dosyaların dosya uzunluğunu görmek isterseniz ne olur? PassThru parametresi ile orijinal nesneye eklenen SideIndicator özelliği ile orijinal özellikler ardışık düzen üzerinden taşınır.
Compare-Object -Ref $WindowsExesOnly -Dif $SecondLevelExes -Property Name,Hash -PassThru | Select-Object SideIndicator,Name,Hash,Length
Veri Akışından Karma Değer Oluşturma
Şu ana kadar bir dosyanın karma değerini nasıl bulacağınızı öğrendiniz ancak Get-FileHash size daha iyisini yapabilir. Ayrıca bir dosyada depolanmayan verilerin karmasını, yani bir veri akışını da alabilir.
Herhangi bir farkın, hatta fazladan bir yeni satır karakterinin bile hash'in değişmesine neden olacağını unutmayın. Karma oluşturma sorunlarını önlemenin bir yöntemi, verileri aşağıda gösterildiği gibi InputStream parametresi aracılığıyla Get-FileHash'e iletilen bir veri akışına dönüştürmektir.
Create an in-memory stream of data with the [System.IO.MemoryStream] constructor.
Retrieve the bytes of a string using the [System.Text.Encoding]::ASCII static method.
$String = "Hello World"
Get-FileHash -InputStream ([System.IO.MemoryStream]::New([System.Text.Encoding]::ASCII.GetBytes($String)))Aslında, herhangi bir bayt serisini Get-FileHash'in oluşturması için RAM'de depolanan bir veri serisi olan MemoryStream'e dönüştürebilirsiniz. sadece dizelerden değil, karmadan da!
Birden Çok Dosyaya Bölünmüş Bir Dosyanın Karmasını Hesaplama (Yığınlanmış Veri)
5 TB'lık büyük bir yedekleme dosyanız olduğunu ve dosyayı doğrulamak için elde edilen karma değere sahip olduğunuzu varsayalım. Boyutu nedeniyle dosya, depolama esnekliği sağlamak amacıyla 100 GB'lık parçalanmış veri bloklarına bölündü.
Orijinal dosyayı doğrulamanın olası bir yolu, 100 GB'lık dosyaların tümünü bir araya getirmek ve ortaya çıkan dosyanın karmasını doğrulamaktır. Elbette 5 TB çok fazla disk alanıdır!
Bunun yerine, tek tek dosya karma değerlerini birleştirebilirsiniz. Karma değerlerini birleştirerek, disk alanını tüketen dosyaları birleştirme adımını atlamış olursunuz. Parçalanmış verilerin birleştirilmiş karma değerine nasıl aktarılacağına ilişkin bir örnek için aşağıdaki koda bakın.
# First, create a hash algorithm object using SHA256.
$Algorithm = [System.Security.Cryptography.HashAlgorithm]::Create("SHA256")
# Next, create a cryptographic stream of data using the SHA256 hash algorithm.
$CryptoStream = [System.Security.Cryptography.CryptoStream]::new(
([System.IO.Stream]::Null),
$Algorithm,
"Write"
)
# Retrieve each file and copy the data into the cryptographic stream.
foreach ($File in Get-ChildItem -File) {
$FileStream = [io.file]::OpenRead($File.FullName)
$FileStream.CopyTo($CryptoStream)
}
# Close all files and close out the cryptographic stream.
$FileStream.Close()
$CryptoStream.FlushFinalBlock()
# Combine all of the hashes as hexadecimal formats "X2" and join the values.
($Algorithm.Hash | ForEach-Object {$_.ToString("X2")}) -join ''Bir kenara: Dosyaların Parçalanmasını ve Akışını Anlamak
Dosya karmalarını hesaplamak için verilerin parçalanması ve akışının tüm ayrıntılarını anlamanıza gerek yok, ancak tüm bunların tam olarak nasıl çalıştığını gerçekten öğrenin!
Bu parçalama ve akışın doğasını göstermek için kaynak dosyanızın 1 ve 2 değerlerini içerdiğini hayal edin. Her sayının arasında, aşağıda gösterilen onaltılık düzenleyicide temsil edildiği gibi bir Windows yeni satırı (\r\n) bulunur.
Bu kaynak dosya, içlerinde sırasıyla 1 ve 2 içeriği bulunan iki dosyaya bölünmüştür. Her dosyayı onaltılık görüntüleyicide görüntülemek, her dosyanın bir sayı ve Windows yeni satırıyla birlikte üç bayttan oluştuğunu gösterir.
Aşağıda gösterildiği gibi, kaynak dosya karması ve bu iki parçalanmış dosyanın karması eşleşir.
Aynı karmayı elde etmek için girdi dosyanızın sırasının kaynak dosyadaki bayt sırasıyla eşleştiğinden emin olmanız önemlidir. Giriş dosyalarının sırasını Sort-Object ile değiştirirseniz karmanın tamamen değişeceğine dikkat edin.
Bu bilgiyle donanmış olarak, 5 TB'lık dosyanın karma işlemini neredeyse hiç kısa sürede yapabilirsiniz!
Sonraki adımlar
Bu makalede, PowerShell'de Get-FileHash cmdlet'inin nasıl kullanılacağını öğrendiniz. Ayrıca karma işleminin doğasını, güvenli karma oluşturma gerekliliklerini ve ihtiyaçlarınız için doğru algoritmayı seçmenize yardımcı olacak en iyi uygulamaları da öğrendiniz.
Bu bilgiyle donanmış olarak, yalnızca tek bir karakter değiştirildiğinde bile verilerde yapılan değişiklikleri ayrıntılı olarak tanımlayabileceksiniz!










