我正在编写一个R Shiny应用程序,该应用程序最终将上线。该应用程序的一部分需要密码保护。只有使用正确密码的人才能在应用程序上添加某些信息。现在,我的方法如下:
我的问题是这种方法是否存在安全缺陷?有更好的方法吗?
我不十分了解人们在在线时可以访问哪些代码或数据库来创建闪亮的应用程序,这就是为什么我不确定这是否是一种好方法的原因。
谢谢!
您走在正确的轨道上。我的建议是使用一个包来处理您的哈希/加密,也对您的数据进行加密。
该方法将是:
这提供了相当不错的安全性,对您公司的仪表板来说足够好,但对医疗记录来说还不够好。
始终假定人们可以在闪亮的应用程序后面查看代码和数据。如果没有密码或密码存储在应用程序中,这包括手动运行数据库查询。
下面是最小的示例:
library(shiny)
library(sodium)
ui <- fluidPage(
passwordInput("txt_password", "Enter Password"),
actionButton("btn_action", "Submit")
)
server <- function(input, output, session) {
#Load Encrypted Data
data_encrypted <- readRDS("data_encrypted.rds")
#Public key
key_public <- "e5 c2 cb 08 27 41 26 1a 06 ad 9f 6a c9 29 ad 37 f0 66 f1 cd b7 f7 1e 24 e9 8b 26 8e 81 b6 68 16"
#Observe submit button (runs once when submit button is clicked)
observeEvent(input$btn_action, {
#Private key
key_private <- sha256(charToRaw(input$txt_password))
#Check if private key provided is correct
if(paste(pubkey(key_private), collapse = " ") == key_public) {
showNotification("Correct password")
#Unencrypt data and make it available globally
data_unencrypted <<- unserialize(simple_decrypt(data_encrypted, key_private))
#Print data to the console, so we can check it worked
print(data_unencrypted)
} else {
showNotification("Incorrect password")
}
})
}
shinyApp(ui, server)
以下代码显示了在上传应用程序之前如何加密数据:
library(sodium)
#Your password
mysupersecretpassword <- "abc"
#Your data
data_unencrypted <- data.frame(id = seq(1:10))
#Private key
key_private <- sha256(charToRaw(mysupersecretpassword))
paste("Private Key:", paste(key_private, collapse = " "))
#Public key
key_public <- pubkey(key_private)
paste("Public Key:", paste(key_public, collapse = " "))
#Encrypt data
data_encrypted <- simple_encrypt(serialize(data_unencrypted, NULL), key_public)
#Save data
saveRDS(data_encrypted, "data_encrypted.rds")
#Cleanup
rm(list=ls())