Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 使用哈希为部分应用程序提供简单的密码保护_R_Sqlite_Hash_Shiny_Password Protection - Fatal编程技术网

R 使用哈希为部分应用程序提供简单的密码保护

R 使用哈希为部分应用程序提供简单的密码保护,r,sqlite,hash,shiny,password-protection,R,Sqlite,Hash,Shiny,Password Protection,我正在写一个R闪亮的应用程序,最终将上线。部分应用程序需要密码保护。只有拥有正确密码的人才能在应用程序上添加某些信息。我现在的做法如下: 使用SHA或类似的哈希算法从文本框中哈希输入的密码 将哈希与数据库中具有使用部分应用程序权限的哈希表进行比较 仅当密码可接受时才将输入信息发送到数据库 我的问题是,这种方法是否存在安全缺陷?有更好的方法吗 我不太熟悉人们在线时可以访问哪些代码或数据库来创建闪亮的应用程序,这就是为什么我不确定这是否是一个好方法 谢谢 你在正确的轨道上。我的建议是使用一个包来处理

我正在写一个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())