3

現在 R コードでハードコードされているパスワードを、ディスク上の「暗号化」/エンコードされたファイルに移動しようとしています。

SAS PWENCODE プロシージャと同様の方法で実行したいと思います ( http://support.sas.com/documentation/cdl/en/proc/63079/HTML/default/viewer.htm#n0ii0upf9h4a67n1bcwcesmo4zms.htmODBC パスワード セキュリティSASで)。

Rに似たようなものはありますか?パスワードを入力するという形で人間の介入なしに定期的に実行する必要があるコードのパスワードを R に保存するには、どのようなアプローチを使用しますか?

編集:言及するのを忘れました:私に似ているのは RCurl::base64() だけです。

4

1 に答える 1

2

以下のブログ投稿で、Windows でこれを実現する方法を概説しました。

http://www.gilfillan.space/2016/04/21/Using-PowerShell-and-DPAPI-to-securely-mask-passwords-in-R-scripts/

本質的に...

  1. PowerShell の実行が有効になっていることを確認します。

  2. 次のテキストを 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")
    
  3. 上記のスクリプトを実行し (右クリック > [PowerShell で実行])、パスワードに意味のある名前を付けて、パスワードを入力します。%USERPROFILE%/DPAPI/passwords/[PC NAME]/[PASSWORD IDENTIFIER.txt] のファイルを確認することで、パスワードが暗号化されていることを確認できるようになりました。

  4. 次に、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))
    }
    
  5. R でパスワードを入力する必要がある場合は、パスワードのハードコーディングやプロンプトを表示する代わりに、次のコマンドを実行できます。

    getEncryptedPassword("[PASSWORD IDENTIFIER]")
    

    たとえば、ROracle コマンドを実行する代わりに、次のようにします。

    dbConnect(driver, "MYUSER", "MY PASSWORD", dbname="MYDB")
    

    代わりにこれを実行できます (ステップ 3 で指定した識別子は "MYUSER_MYDB" です:

    dbConnect(driver, "MYUSER", getEncryptedPassword("MYUSER_MYDB"), dbname="MYDB")
    
  6. 必要な数のパスワードに対してステップ 3 を繰り返し、ステップ 5 で正しい ID を使用して単純に呼び出すことができます。
于 2016-03-24T13:33:48.573 に答える