使用散列为R Shiny应用程序的部分提供简单的密码保护

问题描述 投票:0回答:1

我正在编写一个R Shiny应用程序,该应用程序最终将上线。该应用程序的一部分需要密码保护。只有使用正确密码的人才能在应用程序上添加某些信息。现在,我的方法如下:

  1. 使用SHA或类似的哈希算法从文本框中哈希输入的密码。
  2. 将散列与数据库中具有散列表的散列表进行比较,并有权使用该应用的一部分。
  3. 仅在可接受密码的情况下,才将输入信息发送到数据库。

我的问题是这种方法是否存在安全缺陷?有更好的方法吗?

我不十分了解人们在在线时可以访问哪些代码或数据库来创建闪亮的应用程序,这就是为什么我不确定这是否是一种好方法的原因。

谢谢!

r sqlite hash shiny password-protection
1个回答
0
投票

您走在正确的轨道上。我的建议是使用一个包来处理您的哈希/加密,也对您的数据进行加密。

该方法将是:

  1. 用户在文本框中输入密码(这是私钥)
  2. 将私钥与存储在应用程序中的公钥进行比较
  3. 如果匹配,则解密数据/解密数据库连接字符串

这提供了相当不错的安全性,对您公司的仪表板来说足够好,但对医疗记录来说还不够好。

始终假定人们可以在闪亮的应用程序后面查看代码和数据。如果没有密码或密码存储在应用程序中,这包括手动运行数据库查询。

下面是最小的示例:


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())
© www.soinside.com 2019 - 2024. All rights reserved.