Безопасно используйте пароли в файлах R - не допускайте их сохранения в виде простого текста - PullRequest
1 голос
/ 16 октября 2019

Мне интересно, есть ли пакет или решение, на мой взгляд, очень распространенной проблемы. В большинстве случаев при использовании R для доступа к базам данных необходимо предоставить драйверу ODBC комбинацию пользователя и пароля. Например, довольно распространенный R-скрипт в этом случае будет выглядеть так:

 library(DBI)
 rodbc <- DBI::dbConnect(RODBCDBI::ODBC()
                   , dsn = "DSN0123"
                   , user = "user"
                   , password = "pass" )

Я хотел бы знать, существует ли автоматический способ обойти тот факт, что комбинация пользователя и пароля находится в файловой системе в виде простого текста,Конечно, я мог удалить комбинацию вручную, но это довольно утомительно. Возможно, есть также пакет, который позволяет мне запрашивать пароль каждый раз, когда я впервые получаю доступ к базе данных.

1 Ответ

0 голосов
/ 16 октября 2019

Одним из решений является использование пакета 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")
...