首页 > 系统相关 >【PowerShell】Powershell脚本中的密码安全

【PowerShell】Powershell脚本中的密码安全

时间:2023-12-25 13:32:31浏览次数:39  
标签:SecureString PS Get WINDOWS system32 Powershell 密码 key PowerShell

方法一 使用"凭证管理器"

1.1 创建Windows凭证的普通凭证:

【PowerShell】Powershell脚本中的密码安全_脚本

1.2 使用powershell获取凭证信息

PS D:\> Get-StoredCredential -Target 1111
Get-StoredCredential: The term 'Get-StoredCredential' is not recognized as a name of a cmdlet, function, script file, or executable program.
Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
PS D:\>

1.3 安装CredentialManager模块:

PS D:\> Install-Module -Name CredentialManager

Untrusted repository
You are installing the modules from an untrusted repository. If you trust this repository, change its InstallationPolicy value by running the
Set-PSRepository cmdlet. Are you sure you want to install the modules from 'PSGallery'?
[Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help (default is "N"): Y
PS D:\>
PS D:\>

1.4 继续使用powershell获取凭证信息

PS D:\> Get-Command -Module CredentialManager

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Cmdlet          Get-StoredCredential                               2.0        CredentialManager
Cmdlet          Get-StrongPassword                                 2.0        CredentialManager
Cmdlet          New-StoredCredential                               2.0        CredentialManager
Cmdlet          Remove-StoredCredential                            2.0        CredentialManager

PS D:\>
PS D:\>
PS D:\> Get-StoredCredential -Target 1111

UserName                     Password
--------                     --------
root     System.Security.SecureString

PS D:\>

PS D:\> $c = Get-StoredCredential -Target 1111
PS D:\> $c.UserName
root
PS D:\> $c.Password
System.Security.SecureString
PS D:\>

1.5 使用凭证管理器中的凭证:

PS D:\> $c = Get-StoredCredential -Target 1111
PS D:\> $username = $c.UserName
PS D:\> $secure = $c.Password
PS D:\> $cred = New-Object System.Management.Automation.PSCredential($username,$secure)
PS D:\> $DeviceIP = "192.168.11.142"
PS D:\> $port = 22
PS D:\> $session01 = New-SSHSession -ComputerName $DeviceIP -Credential $cred -AcceptKey -Port $port
PS D:\> $result = Invoke-SSHCommand -SessionId $session01.SessionId -Command 'cd /xml && pwd'
PS D:\> $result.Output
/xml
PS D:\>

只能在创建凭证的当前账户下使用;计算机上的其他账户都无法使用。

方法二 执行时输入

这个最简单

$cerd1 = Get-Credential

这就只适合图形化界面中手动执行的情况了。

执行的时候输入凭证的用户使用

方法三 使用SecureString

3.1 密码明文写入脚本文件中

PS C:\WINDOWS\system32> $username = "root"
PS C:\WINDOWS\system32> $password = "********"
PS C:\WINDOWS\system32> $DeviceIP = "192.168.11.142"
PS C:\WINDOWS\system32> $port = 22
PS C:\WINDOWS\system32> $secure = $password | ConvertTo-SecureString -AsPlainText -Force
PS C:\WINDOWS\system32> $cred = New-Object System.Management.Automation.PSCredential($username,$secure)
PS C:\WINDOWS\system32> $session01 = New-SSHSession -ComputerName $DeviceIP -Credential $cred -AcceptKey -Port $port
PS C:\WINDOWS\system32> $result = Invoke-SSHCommand -SessionId $session01.SessionId -Command 'cd /xml && pwd'
PS C:\WINDOWS\system32> $result.Output
/xml
PS C:\WINDOWS\system32>

任何有权限访问和执行脚本的用户均可使用,且密码为明文,不安全。

3.2 密码密文写入脚本文件中:

首先,明文密码加密:

PS C:\WINDOWS\system32> $secure = '12345678' | ConvertTo-SecureString -AsPlainText -Force
PS C:\WINDOWS\system32> $secure
System.Security.SecureString
PS C:\WINDOWS\system32>
PS C:\WINDOWS\system32> $secret = ConvertFrom-SecureString $secure
PS C:\WINDOWS\system32> $secret
01000000d08c9ddf0115d1118c7a00c04fc297eb01000000f5084322e58a964ea05a4cbd6ec38b640000000002000000000010660000000100002000000087ca7777664cd15fa905da31000813ac23d96b44cef9fe98eefe28fc1c086236000000000e800000000200002000000029c626a9a500d2026fcdabedfaa43542f33f98c6e5d0997c12c7f0100a7d0ddf20000000c15fd7937ebab9a2d4066c2b3838f42c94d056604df4191a6e4ba2d9cd55d926400000002fde228d00bdd08ecd93dfb15a3ff8a25836b0036f78f6175a156b8ab23627e2955c9edd34e7af650ee1b2ded2217b01efcd638b8704dac6698f1a60aa90777a
PS C:\WINDOWS\system32>

ConvertFrom-SecureString 命令生成的加密字符串,我们把它保存到文本文件中:

【PowerShell】Powershell脚本中的密码安全_密码_02

或者:

ConvertFrom-SecureString $secure | Out-File "c:tempsec.txt"

使用密文密码:

PS C:\WINDOWS\system32> $secure1 = Get-Content 'c:\temp\sec.txt' | ConvertTo-SecureString
PS C:\WINDOWS\system32> $secure1.Length
8
PS C:\WINDOWS\system32> $secure1
System.Security.SecureString
PS C:\WINDOWS\system32>
PS C:\WINDOWS\system32> $cred = New-Object System.Management.Automation.PSCredential($username,$secure1)
PS C:\WINDOWS\system32> $session01 = New-SSHSession -ComputerName $DeviceIP -Credential $cred -AcceptKey -Port $port
PS C:\WINDOWS\system32> $result = Invoke-SSHCommand -SessionId $session01.SessionId -Command 'cd /xml && pwd'
PS C:\WINDOWS\system32> $result.Output
/xml
PS C:\WINDOWS\system32>

加密密文只能在创建密文的账户下使用,其他用户均无法使用

PS C:\WINDOWS\system32> $secure1 = Get-Content 'c:\temp\sec.txt' | ConvertTo-SecureString ConvertTo-SecureString : 该项不适于在指定状态下使用。 所在位置 行:1 字符: 44 + $secure1 = Get-Content 'c:\temp\sec.txt' | ConvertTo-SecureString + ~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidArgument: (:) [ConvertTo-SecureString],CryptographicException + FullyQualifiedErrorId : ImportSecureString_InvalidArgument_CryptographicError,Microsoft.PowerShell.Commands.Conv ertToSecureStringCommand PS C:\WINDOWS\system32>

方法四 SecureString的安全与移植(自定义加密密钥)

创建自定义的加密key:

key的长度可以是16, 24, 或者32字节。

Function RandomKey {
     $RKey = @()
     For ($i=1; $i -le 24; $i++) {
     [Byte]$RByte = Get-Random -Minimum 0 -Maximum 256
     $RKey += $RByte
     }
     return $RKey
}
$key = RandomKey
Set-Content -Path "C:\temp\sec_key.txt" -Value $key

或者

$key = New-Object Byte[] 32
[Security.Cryptography.RNGCryptoServiceProvider]::Create().GetBytes($key)
Set-Content -Path "C:\temp\sec_key.txt" -Value $key

使用自定义的key加密SecureString:

$ScureString = ConvertTo-SecureString -String "********" -AsPlainText -Force
$key = Get-Content -Path "C:\temp\sec_key.txt"
$EncryptedPW = ConvertFrom-SecureString -SecureString $ScureString -Key $key
Set-Content -Path "C:\temp\sec_pw.txt" -Value $EncryptedPW

使用自定义key解密SecureString:

$uername = 'root'
$EncryptedPW = Get-Content -Path "C:\temp\sec_pw.txt"
$key = Get-Content -Path "C:\temp\sec_key.txt"
$SecureString = ConvertTo-SecureString -String $EncryptedPW -Key $key
$cred = New-Object System.Management.Automation.PSCredential($username,$SecureString)
$cred.GetNetworkCredential().Password

Example:

#-----user A------
# 1.创建加密密钥
PS C:\WINDOWS\system32> Function RandomKey {
>>      $RKey = @()
>>      For ($i=1; $i -le 24; $i++) {
>>      [Byte]$RByte = Get-Random -Minimum 0 -Maximum 256
>>      $RKey += $RByte
>>      }
>>      return $RKey
>> }
PS C:\WINDOWS\system32> $key = RandomKey
PS C:\WINDOWS\system32> Set-Content -Path "C:\temp\sec_key.txt" -Value $key
PS C:\WINDOWS\system32> $key
109
214
66
202
31
9
224
151
125
51
123
123
250
145
240
188
15
13
137
47
238
25
30
101
PS C:\WINDOWS\system32>
PS C:\WINDOWS\system32> Get-Content -Path "C:\temp\sec_key.txt"
109
214
66
202
31
9
224
151
125
51
123
123
250
145
240
188
15
13
137
47
238
25
30
101
PS C:\WINDOWS\system32>

# 2.自定义的key加密SecureString
PS C:\WINDOWS\system32> $ScureString = ConvertTo-SecureString -String "********" -AsPlainText -Force
PS C:\WINDOWS\system32> $ScureString
System.Security.SecureString
PS C:\WINDOWS\system32> $EncryptedPW = ConvertFrom-SecureString -SecureString $ScureString -Key $key
PS C:\WINDOWS\system32> $EncryptedPW
76492d1116743f0423413b16050a5345MgB8AHgAZgBvAHYASgB5AFYAKwBjAFEAVgBhAGIAbgA1ADgAQwBXAFAAUQA0AEEAPQA9AHwAZgBiAGUAMgA5ADYAZgAxADcAOQBlADIAZgAzADIAZABiAGMANAA2ADMANgBkADMANwBkADkAYQBjADAAZgA4ADEANQBmADEAYQA5AGEAZABjADgAYwA4AGQAMABhAGYAMgBmAGUAMwAzADMAYgA5AGIANAA5ADcANAA0ADUAMgA=
PS C:\WINDOWS\system32> Set-Content -Path "C:\temp\sec_pw.txt" -Value $EncryptedPW
PS C:\WINDOWS\system32> Get-Content -Path "C:\temp\sec_pw.txt"
76492d1116743f0423413b16050a5345MgB8AHgAZgBvAHYASgB5AFYAKwBjAFEAVgBhAGIAbgA1ADgAQwBXAFAAUQA0AEEAPQA9AHwAZgBiAGUAMgA5ADYAZgAxADcAOQBlADIAZgAzADIAZABiAGMANAA2ADMANgBkADMANwBkADkAYQBjADAAZgA4ADEANQBmADEAYQA5AGEAZABjADgAYwA4AGQAMABhAGYAMgBmAGUAMwAzADMAYgA5AGIANAA5ADcANAA0ADUAMgA=
PS C:\WINDOWS\system32>


# 3.使用自定义key解密SecureString
PS C:\WINDOWS\system32> $EncryptedPW = Get-Content -Path "C:\temp\sec_pw.txt"
PS C:\WINDOWS\system32> $key = Get-Content -Path "C:\temp\sec_key.txt"
PS C:\WINDOWS\system32> $SecureString = ConvertTo-SecureString -String $EncryptedPW -Key $key

# 4.使用解密后的SecureString
PS C:\WINDOWS\system32> $username = 'root'
PS C:\WINDOWS\system32> $cred = New-Object System.Management.Automation.PSCredential($username,$SecureString)
PS C:\WINDOWS\system32> $DeviceIP = "192.168.11.142"
PS C:\WINDOWS\system32> $port = 22
PS C:\WINDOWS\system32> $session01 = New-SSHSession -ComputerName $DeviceIP -Credential $cred -AcceptKey -Port $port
PS C:\WINDOWS\system32> $result = Invoke-SSHCommand -SessionId $session01.SessionId -Command 'cd /xml && pwd'
PS C:\WINDOWS\system32> $result.Output
/xml
PS C:\WINDOWS\system32>


#-----user B-----
# 5.另一个账户B使用A账户自定义加密的SecureString
PS C:\Users\admin> $EncryptedPW = Get-Content -Path "C:\temp\sec_pw.txt"
PS C:\Users\admin> $key = Get-Content -Path "C:\temp\sec_key.txt"
PS C:\Users\admin> $SecureString = ConvertTo-SecureString -String $EncryptedPW -Key $key
PS C:\Users\admin>
PS C:\Users\admin> $username = 'root'
PS C:\Users\admin> $cred = New-Object System.Management.Automation.PSCredential($username,$SecureString)
PS C:\Users\admin> $DeviceIP = "192.168.11.142"
PS C:\Users\admin> $port = 22
PS C:\Users\admin> $session01 = New-SSHSession -ComputerName $DeviceIP -Credential $cred -AcceptKey -Port $port
PS C:\Users\admin> $result = Invoke-SSHCommand -SessionId $session01.SessionId -Command 'cd /xml && pwd'
PS C:\Users\admin> $result.Output
/xml
PS C:\Users\admin>

【PowerShell】Powershell脚本中的密码安全_夏明亮_03


任何可以访问自定义key文件的用户均可使用;可以在权限上限制对key文件的访问达到限制用户访问的目的。

并且我们也将sec_key.txt和sec_pw.txt复制到其他的计算机中使用。

标签:SecureString,PS,Get,WINDOWS,system32,Powershell,密码,key,PowerShell
From: https://blog.51cto.com/mlxia/8967522

相关文章

  • powershell中使用hyper-v 命令代码
    PowerShell中使用Hyper-V挂载、分离、创建和格式化VHD的代码:挂载VHD文件:powershell#挂载VHD文件Mount-VHD-Path"C:\test\disk.vhd"分离VHD文件:powershell#分离VHD文件Dismount-VHD-Path"C:\test\disk.vhd"创建VHD文件:powershell#创建10GB的VHD文件,并存......
  • LINUX修改用户密码-交互式与非交互式
     wenwenxiong于2016-06-2719:24:16发布阅读量4.9k 收藏 4点赞数分类专栏: shell shell专栏收录该内容27篇文章0订阅订阅专栏最近管理的一批机器,有个需求是要统一修改一个帐号的用户名密码,比如将qa帐号的密码改为1234,后来还为了脚本化,很方......
  • 密码学门限方案实现
    密码学门限方案实现分出来的块/***块。将密钥按照某种规则分解成的密码片。对应于多项式的坐标,index表示横坐标,value表示纵坐标**@authorSeven*@version1.0*@date2020-09-1422:18*/@DatapublicclassPiece{/***块下标,从1开始*/......
  • 密码学期末复习
    密码学复习笔记欧几里得算法欧几里得算法(辗转相除法)利用带余除法求两个整数a和b的最大公因子的过程。给定两个正整数a和b,假定a大于b,由带余除法,可以得到:其中r就是a和b的最大公因子算术基本定理同余关系的性质取模重要结论快速幂计算器快速模幂运算如果B是2......
  • [CSP-S 2023] 密码锁
    题目描述小Y有一把五个拨圈的密码锁。如图所示,每个拨圈上是从\(0\)到\(9\)的数字。每个拨圈都是从\(0\)到\(9\)的循环,即\(9\)拨动一个位置后可以变成\(0\)或\(8\),因为校园里比较安全,小Y采用的锁车方式是:从正确密码开始,随机转动密码锁仅一次;每次都是以某个幅度......
  • ESP-IDF的PowerShell窗口有时无法打开
    ESP-IDF的PowerShell窗口有时无法打开可能是由于多种原因引起的。以下是一些可能的解决方案:检查网络连接:确保您的计算机与互联网正常连接,并且没有任何防火墙或代理服务器阻止了PowerShell的访问。重启计算机:有时候,重新启动计算机可以解决临时的软件问题。尝试重新启动计算机......
  • [转]PKCS#5研究——基于口令的密码技术(合)
    原文地址:PKCS#5研究——基于口令的密码技术(合)-CSDN博客 本文档对PKCS#5v2.1(基于口令的密码标准)介绍的基于口令的密钥生成函数、基于口令的加密方案、基于口令的消息认证MAC方案进行简要分析记录。其核心为基于口令的密钥生成函数即将口令(Password)通过密钥导出函数KDF后生成主......
  • 头歌—衍生密码体制
    #第1关:Rabin密码体制题目描述任务描述Rabin密码体制是RSA密码体制的一种。本关任务:使用Rabin密码体制对给定的明文进行加密。相关知识为了完成本关任务,你需要掌握:Rabin密码体制。Rabin密码体制在本关中,我们描述Rabin密码体制,假定模数n=pq不能被分解,则该类体质对于选择明......
  • 【Powershell】Powershell在远程计算机上执行指令
    开启并配置WinRM被远程机器执行前提:被远程的机器上开启可WinRM如果连接失败;则需要在被远程的机器上运行:Enable-PSRemoting-SkipNetworkProfileCheck-Force验证方法:WinRM处于Running状态防火墙rule处于Allow状态远程机器执行如果远程的计算机没有加入域(这里注意是执行远程指令的机......
  • powershell 作服务端 响应网络(socket tcp)连接 提供文件夹大小查询服务
    包含:端口占用检测心跳包网络断线检测传入的数据是否为合法有效的目录路径检测读取计算文件夹大小(不含软链接|symlink)传回查询到的文件夹大小[cmdletbinding()]Param($Port=8888)$VerbosePreference="Continue"#值或取`SilentlyContinue`,此时需调用脚本时传入`-Ve......