在 R 文件中安全使用密码 - 防止它们以纯文本形式存储
Safely use passwords in R files - prevent them to be stored as plain text
我想知道在我看来,是否有针对一个非常常见问题的软件包或解决方案。在大多数情况下,当使用 R 访问数据库时,必须向 ODBC 驱动程序提供用户和密码的组合。
例如,在这种情况下,一个非常常见的 R 脚本将如下所示:
library(DBI)
rodbc <- DBI::dbConnect(RODBCDBI::ODBC()
, dsn = "DSN0123"
, user = "user"
, password = "pass" )
我想知道是否有自动解决 user/password 组合以纯文本形式驻留在文件系统这一事实的方法。当然我可以手动删除组合,但这非常乏味。也许还有一个包可以让我在第一次访问数据库时得到输入密码的提示。
一种解决方案是使用 keyringr
包并按如下方式使用它。我改编了 CRAN 页面上的 Howto。
这是 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")
我想知道在我看来,是否有针对一个非常常见问题的软件包或解决方案。在大多数情况下,当使用 R 访问数据库时,必须向 ODBC 驱动程序提供用户和密码的组合。 例如,在这种情况下,一个非常常见的 R 脚本将如下所示:
library(DBI)
rodbc <- DBI::dbConnect(RODBCDBI::ODBC()
, dsn = "DSN0123"
, user = "user"
, password = "pass" )
我想知道是否有自动解决 user/password 组合以纯文本形式驻留在文件系统这一事实的方法。当然我可以手动删除组合,但这非常乏味。也许还有一个包可以让我在第一次访问数据库时得到输入密码的提示。
一种解决方案是使用 keyringr
包并按如下方式使用它。我改编了 CRAN 页面上的 Howto。
这是 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")