R은

2017-03-02 3 views
1

나는 암호로 보호 된 파일에서 R로 데이터베이스에 대한 키를 읽고 원료로 변환하기 위해 노력하고있어 탈출하지 않고 charToRaw에 파일에서 백 슬래시가 포함 된 문자열을 전달 :R은

는 가정하면 내 키는 \[email protected]\xErd\xD5b\x1bs입니다.

rawkey1 <- charToRaw("\[email protected]\xErd\xD5b\x1bs") 

> rawkey1 
[1] 0b 40 0e 72 64 d5 62 1b 73 

내가 .csv 파일이 저장 및 R에 다시 읽을 수 다음 charToRaw 기능에 직접 문자열로 키를 통과 할 때 내가 얻을로서 내 목표는 같은 원시 키를 얻는 것입니다 :

savemykey <- data.table(keyinbytes = "\[email protected]\xErd\xD5b\x1bs") 

write.csv(savemykey, file = "My_key.csv") 

mykey <- read.csv("My_key.csv", header = TRUE, stringsAsFactors = FALSE) 
I는 원이 변환 할 수 있으며 원하는 결과 생성

: 직접 charToRaw 전달 함수로부터 생산

> rawkey2 = charToRaw(mykey$keyinbytes) 
> rawkey2 
[1] 0b 40 0e 72 64 d5 62 1b 73 

원료 키 및 키가 들어있는 CSV 파일의 읽기와 동일합니다 :

> rawkey1 == rawkey2 
[1] TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE TRUE 

지금까지 그렇게 좋았습니다. 유일한 문제는 키가 중요한 정보가 들어있는 데이터베이스의 키이므로 암호로 보호 된 파일에 저장하려고합니다.

나는이 일을 생각할 수있는 유일한 방법은 Microsoft Excel (excel.link 패키지로 다시 읽어 들이고 인수로 암호를 제공하는 것)이었습니다. 그러나 그것은 생성에 그들이 다시 읽을 때 백 슬래시 이스케이프로 해석됩니다 파일 .XLSX 것으로 보인다 이것은 원료로 문자에서 잘못된 변환 결과 :.

library(xlsx) 
write.xlsx2(savemykey, file = "My_key.xlsx", append = FALSE) 

그런 다음 나는 Microsoft Excel 파일을 열 할당 내가 처음 키를 사용하여이 결과를 비교하면

library(excel.link) 
mykey <- xl.read.file("My_key.xlsx", xl.sheet = 1, password = "mypassword") 

# Re-running the conversion: 
rawkey3 = charToRaw(mykey$keyinbytes) 

> rawkey3 
[1] 3f 40 3f 72 64 d5 62 3f 73 

, 일치하지 않습니다 :

> rawkey3 == rawkey1 
[1] FALSE TRUE FALSE TRUE TRUE TRUE TRUE FALSE TRUE 
암호 "mypassword"는, 그것을 저장하고 excel.link 패키지와 함께 다시 읽어

는 Microsoft Excel 파일에서 읽을 때 때문에, R은 그들에게 다음과로 대체 문자를 탈출, 탈출로 백 슬래시를 해석 한이되고, 아래 참조 '?': 나는 한 내용을

# Key as assigned object in R: 
> savemykey$keyinbytes 
[1] "\[email protected]\016rdÕb\033s" 

# Key read in from Microsoft Excel file: 
> mykey$keyinbytes 
[1] "[email protected]?rdÕb?s" 

을 바탕으로 지금까지 시도한 것처럼, 일반 텍스트 (.csv, .txt 또는 R 스크립트 및 소스에 직접 저장)로 저장할 수있는 파일 형식으로 키를 저장하면 키가 R로 다시 읽혀집니다. 백 슬래시를 올바르게 평가하고 올바른 바이트 패턴으로 변환합니다. 그러나 일반 텍스트 파일/.csv 또는 R 스크립트를 암호로 보호하는 방법을 찾지 못했습니다. R로 및 방법에있는 읽기 다시 읽을 때

  • 키에서 백 슬래시의 평가를 보존 할 암호로 보호 일반 텍스트 형식의 파일의 방법을 찾을 :

    내가하는 중 싶습니다 인수로 암호를 사용하거나;

  • 백 슬래시를 이스케이프 처리하지 않고도 암호로 보호 된 Microsoft Excel 파일에서 키를 읽을 수있는 방법을 찾습니다.

이 작업을 수행하는 방법에 대한 아이디어는 많이 알려 드리겠습니다.

+0

Windows 7 OS에서 RStudio 1.0.136과 함께 (3.3-R) R 3.3.2를 사용하고 있습니다. Microsoft Access 데이터베이스를 쿼리 할 때 32 비트 R을 호출해야하므로 Microsoft Office 프로그램이 32 비트 일 수 있다고 생각합니다 (관련성이있는 경우). –

답변

0

암호화 된 텍스트 파일 (약간의 수정을 가한 데이터 또는 아마 R 스크립트 일 수 있음)을 만드는 방법을 찾았습니다. 암호화 된 파일을 만든 다음 다이제스트 패키지를 사용하여 다시 읽은 후 해독하는 스크립트는 Stephane Doyen이 여기에 작성했습니다 : https://github.com/sdoyen/r_password_crypt. 다음과 같이

이 작동 :

mypw <- charToRaw(getPass("Enter the password for your login details file:")) 

로드 스테판의 쓰기 :

# Load libraries 

# This does the encryption and decryption 
require(digest) 

# This allows users to enter a password securely with a masked widget 
require(getPass) 

# I'll put the details I want to encrypt into a data.table 
require(data.table) 

암호를 생성하고 입력 (길이는 16 문자 숫자 식으로 예를 들어 'myfavouritepw123'의 배수에 있어야합니다). aes 및 read.aes 함수 :

# To encrypt and password protect a 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) 
} 


# To decrypt the file with a password after reading it back in: 
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, stringsAsFactors = F) 
}  

암호화 할 파일을 만듭니다.

참고 : write.aes으로 암호화하면 '\'가 표시되고 앞의 문자는 잘못 해석됩니다. 이것을 피하려면 키를 raw로 변환하고 원시 바이트를 하나의 문자열로 저장하십시오. 각 바이트를 나타내는 문자를 함께 붙여 넣으려면 paste0collapse을 사용하십시오 (sep가 작동하지 않음).

write.aes(df = mysecretlogin1, filename = "mysecretkey.txt", key = mypw) 

가 다시 파일을 읽고 당신의 암호를 해독 :

mysecretlogin1 <- data.table(keyinbytes = paste0(charToRaw("\[email protected]\xErd\xD5b\x1bs"), collapse = " ")) 

은 이전 키로 생성 된 비밀번호를 사용하여 write.aes와 암호화 된 파일에 data.table 쓰기

mypw <- charToRaw(getPass("Enter the password for your login details file:")) 

mysecretlogin2 <- data.table(read.aes(filename = "mysecretkey.txt", key = mypw)) 

확인 내보내고 가져올 파일이 동일한 경우 :

> mysecretlogin1 == mysecretlogin2 
    keyinbytes 
[1,]  TRUE 

키를 원시 형식으로 사용하려면이 함수를 사용하여 문자열을 원시 바이트로 다시 변환 할 수 있습니다 (각 바이트 앞에 원시 벡터로 따옴표없이 목록에 전달할 수있게하려면 "0x"를 더하십시오) :

이 일했다 확인하지

myrawkey <- makeraw(mysecretlogin2$keyinbytes) 

:

> myrawkey 
[1] 0b 40 0e 72 64 d5 62 1b 73 
> str(myrawkey) 
raw [1:9] 0b 40 0e 72 ... 
> is.raw(myrawkey) 
[1] TRUE 

'키'(웃기의 INTE을

makeraw <- function(characterstring) { 
    mystring <- strsplit(characterstring, " ") 
    mystring <- lapply(mystring, function(x) paste0("0x", x)) 
    mystring <- as.raw(unlist(mystring)) 
    mystring 
} 

기능을 적용 nded!)는 키를 (좋은 알파 숫자) 원시 바이트의 문자열 버전으로 대신 저장하여 이스케이프 문자로 백 슬래시를 오해하는 전체적인 문제를 피할 수 있습니다.