[玩转系统] 如何使用 Get-FileHash PowerShell Cmdlet
作者:精品下载站 日期:2024-12-14 13:06:20 浏览:12 分类:玩电脑
如何使用 Get-FileHash PowerShell Cmdlet
您需要比较两个文件或确保文件没有更改吗? PowerShell cmdlet Get-FileHash
为文件或数据流生成哈希值。哈希只是一种将一个值转换为另一个值的函数。有时,哈希值可能较小以节省空间,或者哈希值可能是用于验证文件的校验和。
在本文中,您将了解使用 Get-FileHash
的多种方法,以及有关哈希背景和安全最佳实践的更多详细信息!
先决条件
PowerShell 4 以上的任何版本,其中包括 Windows PowerShell 和 PowerShell Core。
什么是哈希?
如果您可以创建一个代表一些数据或文件的简单值怎么办?哈希值或数字签名允许您比较两组数据。哈希被认为是一致的和功能性的,因为相同的输入总是会创建相同的输出。
因此,即使输入中的单个字符发生更改,哈希也会有所不同。哈希值是使用特定的哈希算法(计算哈希值的方法)来计算的。
每种散列算法都有其非常适合的特定情况。通常需要在速度和安全性之间进行权衡。 MD5 等算法速度快,但哈希值复杂度较低。另一方面,SHA512 生成更复杂的哈希值,但总体速度较慢。
对于安全措施,通常不建议使用 MD5。相反,请尝试使用 SHA512。
散列的一个重要用途是对数据进行签名。有时,两个不同的输入会产生相同的输出哈希。这称为哈希冲突。当任何人都可以预见地为特定算法创建哈希冲突时,该算法就会被认为不太安全或“损坏”。
PowerShell 的 Get-FileHash cmdlet 支持多种算法,如下所列。
- PowerShell Core(版本 6 和 7):
MD5
、SHA1
、SHA256
、SHA384
和SHA512
- Windows PowerShell(版本 4 到 5.1):
MACTripleDES
、MD5
、RIPEMD160
、SHA1
、SHA256
、SHA384
和SHA512
计算单个文件的哈希值
要熟悉 Get-FileHash
cmdlet,请将单个文件传递给该命令,如以下示例所示。
Get-FileHash C:\Windows\write.exe
Get-FileHash
将输出所使用的算法、文件的哈希值以及您指定的文件的完整路径,如下所示。如果未指定其他算法,则所有版本的 PowerShell 的默认值为 SHA256
。
计算目录中文件的哈希值
要为目录中的每个文件生成哈希值,请在 Path
参数中使用通配符 (*
)。您可能会注意到没有指定算法。
复制以下命令并从根 C:\ 目录运行,为 C:\Windows 目录中的所有可执行文件生成 SHA256
哈希值。
# The example below computes the hashes relative to the current directory
# notated by the "." before the "\".
Get-FileHash .\Windows\*.exe
递归生成所有文件的哈希值
要对目录及其子目录中的所有文件进行哈希处理,请通过 Get-ChildItem
递归列出项目,并将结果传递给 Get-FileHash
。尽管您可以在 Get-FileHash
中使用通配符,但这不会递归遍历每个子目录。
Get-ChildItem -Path C:\py* -Recurse -Filter *.exe | Get-FileHash
通过计算属性将文件哈希添加到 Get-ChildItem
输出
Get-FileHash
本身的输出有限。当与 Get-ChildItem 结合使用时,许多文件属性会在输出中丢失。要保留文件信息,请创建一个计算属性来动态添加文件哈希。
下面的示例读取 windows-version.txt 示例文件,仅从 Get-ChildItemName
和 Length
属性/code> 输出,并添加 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}}
使用哈希比较两个目录中的所有文件
假设您有两个文件夹并且需要查找哪些文件不同。您可以通过使用 Get-FileHash
为每个文件生成哈希值,然后比较它们来比较这些文件夹中的所有文件。
基于您通过计算属性和 Get-FileHash
学到的知识,cmdlet Compare-Object
会比较每个文件的计算哈希并输出任何差异。
首先,检索一组可执行文件和计算出的哈希值,以便与 Compare-Object
一起使用。
# 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}}
接下来,使用 ReferenceObject
将生成的文件对象数组 $WindowsExesOnly
和 $SecondLevelExes
提供给 Compare-Object
和 DifferenceObject
参数。运行以下代码并传递 Name
和 Hash
属性以与 Compare-Object
进行比较。同时使用 Name
和 Hash
属性允许相同的文件但具有不同的文件名。
Compare-Object -Ref $WindowsExesOnly -Dif $SecondLevelExes -Property Name,Hash
Compare-Object
输出显示 SideIndicator
属性,该属性指示不相同的文件存在于哪个数组中。如下所示,六个唯一的文件位于 $SecondLevelExes
数组。
如果您想查看唯一文件的文件长度怎么办?使用 PassThru
参数,原始属性通过管道传递,并将 SideIndicator
属性添加到原始对象。
Compare-Object -Ref $WindowsExesOnly -Dif $SecondLevelExes -Property Name,Hash -PassThru | Select-Object SideIndicator,Name,Hash,Length
从数据流生成哈希值
到目前为止,您已经学习了如何查找文件的哈希值,但是 Get-FileHash
可以帮助您做得更好。它还可以获得未存储在文件中的数据的哈希值,即数据流。
请记住,任何差异,甚至是额外的换行符,都会导致哈希值发生变化。避免任何哈希问题的一种方法是将数据转换为数据流,并通过 InputStream
参数传递给 Get-FileHash
,如下所示。
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)))
事实上,您可以将任何一系列字节转换为 MemoryStream
,即存储在 RAM 中的一系列数据,以便 Get-FileHash
生成散列来自,不仅仅是字符串!
计算拆分为多个文件(分块数据)的文件的哈希值
假设您有一个 5TB 的大型备份文件以及生成的哈希值来验证该文件。由于大小的原因,该文件被分成 100GB 的分块数据块,以实现存储灵活性。
验证原始文件的一种可能方法是将所有 100GB 文件组合在一起并验证结果文件的哈希值。当然,5TB 的磁盘空间很大!
相反,您可以组合各个文件的哈希值。通过组合哈希值,您可以跳过组合文件这一消耗磁盘空间的步骤。请参阅下面的代码,了解如何将分块数据流式传输为组合哈希值的示例。
# 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 ''
旁白:了解文件分块和流式传输
没有必要了解分块和流数据的所有来龙去脉来计算文件哈希,但要真正了解这一切是如何工作的!
为了说明这种分块和流式传输的性质,假设您的源文件包含 1
和 2
的值。每个数字之间有一个 Windows 换行符 (\r\n
),如下面所示的十六进制编辑器所示。
该源文件已被拆分为两个文件,分别包含内容 1
和 2
。在十六进制查看器中查看每个文件会显示每个文件都是三个字节,带有数字和 Windows 换行符。
如下所示,源文件哈希和这两个分块文件的哈希匹配。
重要的是要确保输入文件的顺序与源文件中的字节顺序匹配,以获得相同的哈希值。请注意,如果您使用 Sort-Object
更改输入文件的顺序,则哈希会完全更改。
有了这些知识,您几乎可以立即对 5TB 文件进行哈希处理!
下一步
在本文中,您学习了如何在 PowerShell 中使用 Get-FileHash
cmdlet。您还了解了哈希的本质、安全哈希要求以及帮助您选择适合您需求的算法的最佳实践。
有了这些知识,您将能够彻底识别数据的更改,即使只更改了一个字符!
猜你还喜欢
- 03-30 [玩转系统] 如何用批处理实现关机,注销,重启和锁定计算机
- 02-14 [系统故障] Win10下报错:该文件没有与之关联的应用来执行该操作
- 01-07 [系统问题] Win10--解决锁屏后会断网的问题
- 01-02 [系统技巧] Windows系统如何关闭防火墙保姆式教程,超详细
- 12-15 [玩转系统] 如何在 Windows 10 和 11 上允许多个 RDP 会话
- 12-15 [玩转系统] 查找 Exchange/Microsoft 365 中不活动(未使用)的通讯组列表
- 12-15 [玩转系统] 如何在 Windows 上安装远程服务器管理工具 (RSAT)
- 12-15 [玩转系统] 如何在 Windows 上重置组策略设置
- 12-15 [玩转系统] 如何获取计算机上的本地管理员列表?
- 12-15 [玩转系统] 在 Visual Studio Code 中连接到 MS SQL Server 数据库
- 12-15 [玩转系统] 如何降级 Windows Server 版本或许可证
- 12-15 [玩转系统] 如何允许非管理员用户在 Windows 中启动/停止服务
取消回复欢迎 你 发表评论:
- 精品推荐!
-
- 最新文章
- 热门文章
- 热评文章
[影视] 黑道中人 Alto Knights(2025)剧情 犯罪 历史 电影
[古装剧] [七侠五义][全75集][WEB-MP4/76G][国语无字][1080P][焦恩俊经典]
[实用软件] 虚拟手机号 电话 验证码 注册
[电视剧] 安眠书店/你 第五季 You Season 5 (2025) 【全10集】
[电视剧] 棋士(2025) 4K 1080P【全22集】悬疑 犯罪 王宝强 陈明昊
[软件合集] 25年6月5日 精选软件22个
[软件合集] 25年6月4日 精选软件36个
[短剧] 2025年06月04日 精选+付费短剧推荐33部
[短剧] 2025年06月03日 精选+付费短剧推荐25部
[软件合集] 25年6月3日 精选软件44个
[剧集] [央视][笑傲江湖][2001][DVD-RMVB][高清][40集全]李亚鹏、许晴、苗乙乙
[电视剧] 欢乐颂.5部全 (2016-2024)
[电视剧] [突围] [45集全] [WEB-MP4/每集1.5GB] [国语/内嵌中文字幕] [4K-2160P] [无水印]
[影视] 【稀有资源】香港老片 艺坛照妖镜之96应召名册 (1996)
[剧集] 神经风云(2023)(完结).4K
[剧集] [BT] [TVB] [黑夜彩虹(2003)] [全21集] [粤语中字] [TV-RMVB]
[实用软件] 虚拟手机号 电话 验证码 注册
[资源] B站充电视频合集,包含多位重量级up主,全是大佬真金白银买来的~【99GB】
[影视] 内地绝版高清录像带 [mpg]
[书籍] 古今奇书禁书三教九流资料大合集 猎奇必备珍藏资源PDF版 1.14G
[电视剧] [突围] [45集全] [WEB-MP4/每集1.5GB] [国语/内嵌中文字幕] [4K-2160P] [无水印]
[剧集] [央视][笑傲江湖][2001][DVD-RMVB][高清][40集全]李亚鹏、许晴、苗乙乙
[电影] 美国队长4 4K原盘REMUX 杜比视界 内封简繁英双语字幕 49G
[电影] 死神来了(1-6)大合集!
[软件合集] 25年05月13日 精选软件16个
[精品软件] 25年05月15日 精选软件18个
[绝版资源] 南与北 第1-2季 合集 North and South (1985) /美国/豆瓣: 8.8[1080P][中文字幕]
[软件] 25年05月14日 精选软件57个
[短剧] 2025年05月14日 精选+付费短剧推荐39部
[短剧] 2025年05月15日 精选+付费短剧推荐36部
- 最新评论
-
- 热门tag