【IDM】Active Directory から OpenLDAP への パスワードの同期 その1 ~ パスワードを SHA1 で暗号化

当初の予定を変更し、パスワードの暗号化について、ちょっとだけ触れておきたいと思います

以下では、Active Directory に格納された DES / MD5 形式のパスワードをそのままとりだしました。取り出したまま OpenLDAPに格納すれば、生パスワードを経由することなくパスワードの同期が行えます(同期の手法については、また後日)。

【IDM】パスワード同期機能の有効活用 その3 ~ unixUserPassword 属性から暗号化されたパスワードを取得する

同僚の田辺氏が、上記のスクリプトを PowerShell に置き換えてくれましたので、よろしければそちらも参照してください。

『【IDM】パスワード同期機能の有効活用 その3 ~ unixUserPassword 属性から暗号化されたパスワードを取得する』PowerShell 編

さて、ここで当然の要求が出てきます。

DES や MD5 じゃなくて、SHA1 で 暗号化したいんだけど!!??

当然ですね。

暗号化と文字コード変換はなんとかなるとしても、DES / MD5 を複合化することはできませんので、事前に「生パスワード」が取得できるという前提で書きます。 

で、その暗号化と文字コード変換ですが、VBSで何とかしようとしてみたのですが...うまい方法が無く....田辺さんに懐柔されたようで悔しいのですが、PowerShell を使用することにします。

生パスワードを 「annou$01 」 とします。

PS C:\> $strPassword = "annou$01"PS C:\> $objUTF8Enc = new-object System.Text.UTF8EncodingPS C:\> $bytPassword = $objUTF8Enc.GetBytes($strPassword)PS C:\> $objCrypt = new-object System.Security.Cryptography.SHA1CryptoServiceProviderPS C:\> $bytCryptPassword = $objCrypt.ComputeHash($bytPassword)PS C:\> $strBase64Password = [System.Convert]::ToBase64String($bytCryptPassword)PS C:\> $strBase64PasswordgFRVb2AfNnXfx2GUQe5GaEYrnJQ=

最後に表示されている gFRVb2AfNnXfx2GUQe5GaEYrnJQ= が SHA1 で暗号化されたパスワードです。

暗号化の形式を変更する場合には、SHA1CryptoServiceProvider の部分を変えてください。 詳細は、以下を参照してみてください。

System.Security.Cryptography Namespace
https://msdn.microsoft.com/ja-jp/library/system.security.cryptography(en-us,VS.80).aspx

このままでは自動化ができないので、まずは、上記のPowerShellスクリプトを ps1 という拡張子でテキストファイルに保存しましょう。ここでは、cryptSha1.ps1 というファイルに保存したとします。

次に、PowerShell を起動して、以下のコマンドを入力し、自マシンで作成した ps1 ファイルを実行できるようにします。

PS C:\> Set-ExecutionPolicy RemoteSigned

その後、PowerShell を終了し、通常のコマンドプロンプトから以下のように記述しましょう。

C:\> for /f %i in ('powershell c:\cryptsha1.ps1') do set Sha1Password=%i

これで、環境変数 Sha1Password には SHA1 で暗号化されたパスワードが格納されます。あとは、なんとでもなりますね...。もし、バッチファイルから 上記の for コマンドを実行するのであれば、以下のように % は %% と重ねて記述してください。

for /f %%i in ('powershell c:\cryptsha1.ps1') do set Sha1Password=%%i

それにしても...Net Framework が使えるって....べ、便利ですね....

まずい..VBS から乗り換えてしまいそうです.....