У меня есть чувствительный набор данных, который никогда не должен храниться на незашифрованном диске. Может ли R справиться с этим или является полным шифрованием диска, мой единственный вариант?
Как читать зашифрованный файл с диска с помощью R
Ответ 1
У меня есть ощущение, что есть более простой способ сделать это, но пакет digest
, который шифрует AES, является самым близким, с чем я столкнулся с тем, о чем вы просите. Это должно заставить вас начать.
# write encrypted data frame to file
write.aes <- function(df,filename, key) {
require(digest)
zz <- textConnection("out","w")
write.csv(df,zz, row.names=F)
close(zz)
out <- paste(out,collapse="\n")
raw <- charToRaw(out)
raw <- c(raw,as.raw(rep(0,16-length(raw)%%16)))
aes <- AES(key,mode="ECB")
aes$encrypt(raw)
writeBin(aes$encrypt(raw),filename)
}
# read encypted data frame from file
read.aes <- function(filename,key) {
require(digest)
dat <- readBin(filename,"raw",n=1000)
aes <- AES(key,mode="ECB")
raw <- aes$decrypt(dat, raw=TRUE)
txt <- rawToChar(raw[raw>0])
read.csv(text=txt)
}
# sample data
set.seed(1) # for reproducible example
data <- data.frame(x=rnorm(10),y=rpois(10,1),
z=letters[1:10],w=sample(T:F,10,replace=T))
set.seed(123581321)
key <- as.raw(sample(1:32,32))
write.aes(data,"encrypted.dat",key)
result <- read.aes("encrypted.dat",key)
# did it work?
all.equal(data,result)
# [1] TRUE
Это использует шифрование AES в режиме ECB. Очевидно, вам нужно использовать один и тот же ключ для шифрования и дешифрования. write.aes(...)
преобразует фрейм данных в текстовую строку в формате csv, преобразует ее в необработанную (что требуется для AES), накладывает необработанный вектор на кратное 16 байт (также требуется для AES), шифрует и записывает в двоичный файл. read.aes(...)
в основном меняет процесс.
Это просто пример, который должен быть изменен в соответствии с вашими потребностями. Например, это сохраняет кадр данных без имен строк, что может быть или не быть проблемой.