編集:以下の機能が私のRパッケージキーリンガーで利用できるようになりました。キーリングパッケージには、GnomeキーリングとmacOSキーチェーンにアクセスするための同様の機能もあります。
---
Windowsを使用している場合は、PowerShellを使用してこれを行うことができます。以下の私のブログ投稿を参照してください。
http://www.gilfillan.space/2016/04/21/Using-PowerShell-and-DPAPI-to-securely-mask-passwords-in-R-scripts/
基本的に...
-
PowerShellの実行が有効になっていることを確認してください。
-
次のテキストをEncryptPassword.ps1:
というファイルに保存します。# Create directory user profile if it doesn't already exist. $passwordDir = "$($env:USERPROFILE)\DPAPI\passwords\$($env:computername)" New-Item -ItemType Directory -Force -Path $passwordDir # Prompt for password to encrypt $account = Read-Host "Please enter a label for the text to encrypt. This will be how you refer to the password in R. eg. MYDB_MYUSER $SecurePassword = Read-Host -AsSecureString "Enter password" | convertfrom-securestring | out-file "$($passwordDir)\$($account).txt" # Check output and press any key to exit Write-Host "Press any key to continue..." $x = $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")
-
上記のスクリプトを実行し(右クリック> PowerShellで実行)、パスワードに意味のある名前を付けて、パスワードを入力します。これで、%USERPROFILE%/ DPAPI / passwords / [PC NAME] / [PASSWORD IDENTIFIER.txt]
のファイルをチェックして、パスワードが暗号化されていることを確認できます。 -
次に、R内から次のコードを実行します(この関数は、各スクリプトの開始時に取得するRスクリプトに保存されています。
getEncryptedPassword <- function(credential_label, credential_path) { # if path not supplied, use %USER_PROFILE%\DPAPI\passwords\computername\credential_label.txt as default if (missing(credential_path)) { credential_path <- paste(Sys.getenv("USERPROFILE"), '\\DPAPI\\passwords\\', Sys.info()["nodename"], '\\', credential_label, '.txt', sep="") } # construct command command <- paste('powershell -command "$PlainPassword = Get-Content ', credential_path, '; $SecurePassword = ConvertTo-SecureString $PlainPassword; $BSTR = [System.Runtime.InteropServices.Marshal]::SecureStringToBSTR($SecurePassword); $UnsecurePassword = [System.Runtime.InteropServices.Marshal]::PtrToStringAuto($BSTR); echo $UnsecurePassword"', sep='') # execute powershell and return command return(system(command, intern=TRUE)) }
-
これで、Rでパスワードを指定する必要がある場合、ハードコーディング/パスワードの入力を求める代わりに、次のコマンドを実行できます。
getEncryptedPassword("[PASSWORD IDENTIFIER]")
たとえば、ROracleコマンドを実行する代わりに:
dbConnect(driver, "MYUSER", "MY PASSWORD", dbname="MYDB")
代わりにこれを実行できます(手順3で指定した識別子は「MYUSER_MYDB」です:
dbConnect(driver, "MYUSER", getEncryptedPassword("MYUSER_MYDB"), dbname="MYDB")
- 必要な数のパスワードに対して手順3を繰り返し、手順5で正しい識別子を使用してパスワードを呼び出すことができます。