Одним из решений является использование пакета keyringr
и использование его следующим образом. Я адаптировал Howto на странице CRAN. Это решение для Windows-машины. Прежде всего, нужно создать небольшой скрипт powershell PasswordEncryption.ps1:
# Create directory user profile if it doesn't already exist.
$passwordDir = "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")
После выполнения этого скрипта и ввода метки и пароля теперь можно использовать зашифрованный пароль в R.
library(keyringr)
credential_label <- "MYDB_MYUSER"
credential_path <- paste( getwd(),'\\DPAPI\\passwords\\', Sys.info()["nodename"], '\\', credential_label, '.txt', sep="")
my_pwd <- decrypt_dpapi_pw(credential_path)
print(my_pwd)
Или лучше просто добавить вызов для расшифровки пароля непосредственно в команду ODBC и не сохранять его в среде R.
library(DBI)
rodbc <- DBI::dbConnect(RODBCDBI::ODBC()
, dsn = "DSN0123"
, user = "user"
, password = decrypt_dpapi_pw(credential_path))
Редактировать: альтернатива при использованииrstudio должен использовать rstudioapi, вот так:
rodbc <- DBI::dbConnect(RODBCDBI::ODBC()
, dsn = "DSN0123"
, user = rstudioapi::askForPassword("Database user")
, password = rstudioapi::askForPassword("Database password")