r input passwords password-protection

¿Forma de proporcionar de forma segura una contraseña a la aplicación R desde la terminal?



input passwords (5)

¿Tiene R una función que permite a un usuario proporcionar una contraseña de forma segura, como el módulo getpass de Python?

(ver http://docs.python.org/library/getpass.html para ver un ejemplo de lo que quiero decir)


Aquí hay un pop-up de inicio de sesión, basado en ?modalDialog .

library("shiny") shinyApp( ui <- basicPage( actionButton("login", "Login"), verbatimTextOutput("secrets") ), server <- function(input, output, session) { vals <- reactiveValues(authenticated=FALSE) passwordModal <- function(message=NULL) { modalDialog( textInput("username", "Username", input$username), passwordInput("password", "Password", input$password), if (!is.null(message)) div(tags$b(message, style="color: red;")), footer = tagList( modalButton("Cancel"), actionButton("authenticate", "OK") ) ) } observeEvent(input$login, { showModal(passwordModal()) }) observeEvent(input$authenticate, { vals$authenticated <- FALSE if (!is.null(input$username) && nzchar(input$username) && !is.null(input$password) && nzchar(input$password)) { removeModal() if (input$password == "letmein") { vals$authenticated <- TRUE } else { showModal(passwordModal(message="Incorrect password!")) } } else { showModal(passwordModal(message="Please fill in your username and password")) } }) output$secrets <- renderText({ if (vals$authenticated) { paste("Don''t tell anyone, ", input$username, ", but...", sep="") } else { "I can''t tell you that!" } }) } )


Concepto muy simple de Linux para la cuestión de la contraseña segura del terminal:

password <- function(prompt = "Password:"){ cat(prompt) pass <- system(''stty -echo && read ff && stty echo && echo $ff && ff=""'', intern=TRUE) cat(''/n'') invisible(pass) }


El problema es que R no tiene funciones para controlar el terminal en el que se ejecuta (algo así como Rncurses ); probablemente esto se deba a problemas de portabilidad.
Hace algún tiempo tuve problemas con el mismo problema y terminé con una función usando TclTk:

getPass<-function(){ require(tcltk); wnd<-tktoplevel();tclVar("")->passVar; #Label tkgrid(tklabel(wnd,text="Enter password:")); #Password box tkgrid(tkentry(wnd,textvariable=passVar,show="*")->passBox); #Hitting return will also submit password tkbind(passBox,"<Return>",function() tkdestroy(wnd)); #OK button tkgrid(tkbutton(wnd,text="OK",command=function() tkdestroy(wnd))); #Wait for user to click OK tkwait.window(wnd); password<-tclvalue(passVar); return(password); }

Por supuesto, no funcionará en entornos que no sean de GUI.


Mi paquete keyringr resuelve este problema recuperando contraseñas del llavero del sistema operativo subyacente (DPAPI en Windows, Keychain en OSX y Gnome Keyring en Linux).

La vignette proporciona una explicación detallada sobre cómo usar el paquete, pero si usaba OSX y guardaba la contraseña en Keychain, podría usar el siguiente comando para devolver la contraseña a R (donde mydb_myuser es el nombre del elemento Keychain):

install.packages("keyringr") library("keyringr") mypwd <- decrypt_kc_pw("mydb_myuser") print(mypwd)


Por m-dz en los comentarios anteriores, ahora hay un paquete para hacer esto llamado getPass , que tiene una sola función, getPass() . Este es un reemplazo para base::readline() .