R 使用哈希为部分应用程序提供简单的密码保护
我正在写一个R闪亮的应用程序,最终将上线。部分应用程序需要密码保护。只有拥有正确密码的人才能在应用程序上添加某些信息。我现在的做法如下:R 使用哈希为部分应用程序提供简单的密码保护,r,sqlite,hash,shiny,password-protection,R,Sqlite,Hash,Shiny,Password Protection,我正在写一个R闪亮的应用程序,最终将上线。部分应用程序需要密码保护。只有拥有正确密码的人才能在应用程序上添加某些信息。我现在的做法如下: 使用SHA或类似的哈希算法从文本框中哈希输入的密码 将哈希与数据库中具有使用部分应用程序权限的哈希表进行比较 仅当密码可接受时才将输入信息发送到数据库 我的问题是,这种方法是否存在安全缺陷?有更好的方法吗 我不太熟悉人们在线时可以访问哪些代码或数据库来创建闪亮的应用程序,这就是为什么我不确定这是否是一个好方法 谢谢 你在正确的轨道上。我的建议是使用一个包来处理
谢谢 你在正确的轨道上。我的建议是使用一个包来处理散列/加密,并对数据进行加密 方法是:
以下是最简单的例子:
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")
#Create a reactive dataframe to store the unencyrpted data
reactives <- reactiveValues(data_unencrypted = NULL)
#Public key (its okay to hardcode it here, public keys are designed for sharing)
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 elsewhere
reactives$data_unencrypted <- unserialize(simple_decrypt(data_encrypted, key_private))
#Print data to the console, so we can check it worked
print(reactives$data_unencrypted )
} else {
showNotification("Incorrect password")
}
})
#Remove all data when session ends
cancel.onSessionEnded <- session$onSessionEnded(function() {
rm(list = ls())
})
}
shinyApp(ui, server)
库(闪亮)
图书馆(钠)
ui你不能在一个已经安全的环境中托管网站吗,比如公司的vpn或rstudio云,或者shinnyapps.io?@Bruno是的,我可以。因为包含密码信息的表不可访问,这会消除散列的需要吗?不是真的,你不需要处理密码,你只需要假设如果用户已经访问了应用程序,他们就可以访问dataHattie35,几乎每次我看到用户管理的密码,实现中存在一些缺陷,导致有效用户被拒绝,无效用户获得访问权限,或者同样多的是,无效用户带走了大量内部数据。这并不是说存在任何有意的快捷方式,而是很难完全实现良好的安全性,因此我们应该转而依赖经过良好测试的库或接口。此外,正如@Bruno所说,只需在服务器上做一次,而不是在应用程序中。(尽管每个应用程序的烫发次数略有不同。)鉴于。。。将密码的哈希值与存储的哈希值进行比较肯定比存储密码本身要好。这假设哈希总是发生,并且总是发生在服务器上(而不是在客户端可见的代码中,例如javascript,因为这可能会允许欺骗)。感谢您的帮助!
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())