7
9

More than 5 years have passed since last update.

【PowerShell】他ユーザが復号できる形でパスワードを暗号化したい

Last updated at Posted at 2018-08-14

PowerShellスクリプトで特権を使用したい。
だけどパスワードを埋め込みたくない…!!

よしんば自分の端末だけで利用するならともかく、
利用者の使用する端末で管理者権限実行したい!でもパスワードは秘密にしたい!

そういう状況があったので色々やってみました。
以下忘備録

【他ユーザが復号できる形でパスワードを暗号化】

PowerShell

パスワード:p@ssw0rd


#  パスワードをSecure-Stringにして保存
$Secure = ConvertTo-SecureString -String "p@ssw0rd" -AsPlainText -Force

# 暗号化用のバイト配列を作成(192bit)
# 今回は8bit*24個で192bitを用意。復号にも利用するため保管しておく。
[byte[]] $EncryptedKey = (3,4,2,3,56,34,254,222,1,1,2,23,42,54,33,233,1,34,2,7,6,5,35,43)


#セキュアストリングを暗号化された標準文字列に変換
$encrypt = ConvertFrom-SecureString -SecureString $Secure -key $EncryptedKey

#暗号化された標準文字列をテキストに出力
$encrypt | Out-File c:\temp\encrypted.txt

# ちなみに、txtの中身はこんな感じ。
PS C:> $encrypt
76492d1116743f0423413b16050a5345MgB8AGEAQgBEAGcASQBBAGgAbABsAG0AagBqAEUAZwBhAGUARQA3AEgAYQBwAHcAPQA9AHwAOABmADYAYgAxAGM
AZQAxAGQAZgAxAGMAZgBmAGIAYQA1ADcAYwBkAGEAZgAxAGMAZABlAGMAYQAwAGYANQBhADYAOQAxADUAMwA2ADcAMwBlAGYANgBlADAAOQA4ADcAMgAxAG
MAMwA2ADUAZQBjADIAYwA4ADMAYgAwADUAMQA=

最初にSecure-Stringに変換したパスワードを

PowerShell
$encrypt = ConvertFrom-SecureString -SecureString $secure

で標準文字列にするパターンもあるが、それだと他のユーザが複合した際にエラーが出る。

【復号する】

PowerShell

暗号化パスワードファイルパス: C:\temp\encrypted.txt


#暗号化で使用したバイト配列を用意
[byte[]] $EncryptedKey = (3,4,2,3,56,34,254,222,1,1,2,23,42,54,33,233,1,34,2,7,6,5,35,43)

#暗号化された標準文字列を読み込んで、Secure-Stringに変換
$importSecureString = Get-Content C:\temp\encrypted.txt | ConvertTo-SecureString -key $EncryptedKey

#Secure-Stringから文字列を取り出す
$bstr = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($importSecureString)
$StringPassword = [System.Runtime.InteropServices.Marshal]::PtrToStringBSTR($bstr)

#標準出力
write-host $StringPassword

p@ssw0rd

やったぜ。

そして平文にできた喜びから、平文にしたパスワード情報を使用してGet-Credentialで認証情報を作成しようとすると

PowerShell

$credential = New-Object System.Management.Automation.PsCredential "<MyDomain\User>", $StringPassword

New-Object : "PSCredential" のオーバーロードで、引数の数が "2" であるものが見つかりません。
発生場所 C:\Users\hogehoge\Runas.ps1:29 文字:9
+ $cred = New-Object System.Management.Automation.PsCredential $user,$S ...
+         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [New-Object]MethodException
    + FullyQualifiedErrorId : ConstructorInvokedThrowException,Microsoft.PowerShell.Commands.NewObjectCommand


と、上記のようにエラーを吐くため注意。
ちゃんとSecure-Stringを使ってあげればOK。

参考になったサイト:https://github.com/senkousya/usingEncryptedStandardStringOnPowershell

7
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
9