CHỈNH SỬA:Chức năng dưới đây hiện đã có trong keyringr gói R của tôi. Gói keyringr cũng có các chức năng tương tự để truy cập Gnome Keyring và macOS Keychain.
---
Nếu bạn đang sử dụng Windows, bạn có thể sử dụng PowerShell để thực hiện việc này. Xem bài đăng trên blog của tôi bên dưới.
http://www.gilfillan.space/2016/04/21/Using-PowerShell-and-DPAPI-to-secosystem-mask-passwords-in-R-scripts/
Về cơ bản ...
-
Đảm bảo bạn đã bật thực thi PowerShell.
-
Lưu văn bản sau vào một tệp có tên 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")
-
Thực thi tập lệnh ở trên (nhấp chuột phải> Chạy với PowerShell), cung cấp tên có ý nghĩa cho mật khẩu và nhập mật khẩu. Bây giờ, bạn có thể xác minh rằng mật khẩu đã được mã hóa bằng cách kiểm tra tệp trong% USERPROFILE% / DPAPI / password / [PC NAME] / [PASSWORD IDENTIFIER.txt]
-
Bây giờ, hãy chạy đoạn mã sau từ bên trong R (Tôi đã lưu hàm này trong một tập lệnh R mà tôi lấy nguồn ở đầu mỗi tập lệnh.
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)) }
-
Bây giờ, khi bạn cần cung cấp mật khẩu trong R, bạn có thể chạy lệnh sau thay vì mã hóa cứng / nhắc nhập mật khẩu:
getEncryptedPassword("[PASSWORD IDENTIFIER]")
Ví dụ:thay vì chạy lệnh ROracle:
dbConnect(driver, "MYUSER", "MY PASSWORD", dbname="MYDB")
Thay vào đó, bạn có thể chạy phần mềm này (số nhận dạng tôi đã cung cấp ở Bước 3 là "MYUSER_MYDB":
dbConnect(driver, "MYUSER", getEncryptedPassword("MYUSER_MYDB"), dbname="MYDB")
- Bạn có thể lặp lại Bước 3 cho bao nhiêu mật khẩu theo yêu cầu và chỉ cần gọi chúng bằng số nhận dạng chính xác trong Bước 5.