R:通过cyphr加密字符串,发送到JSON,然后从JS转换回字符串导致问题



我想加密一个字符串,然后将其格式化为JSON,这样我就可以安全地将其发送到数据库/前端。但是,当从数据库检索加密数据时,我需要从JSON返回到R-string,这是一个问题:

key <- cyphr::key_sodium(sha256(charToRaw("password123")))
encrypted <- cyphr::encrypt_string("my secret string", key)
encrypted_raw <- rawToChar(encrypted)
json_encrypted <- jsonlite::toJSON(encrypted_raw)
json_encrypted #This variable is then send to the database and retrieved again
json_decrypted <- jsonlite::fromJSON(json_encrypted)
decrypted_raw <- charToRaw(json_decrypted)
cyphr::decrypt_string(decrypted_raw, key)
#Expected output: "my secret string"
#Received output: "Error in decrypt(unpack(msg), key()) : Failed to decrypt"

这似乎是一个问题与jsonlite包:如果我删除这一步,它的工作:

key <- cyphr::key_sodium(sha256(charToRaw("password123")))
encrypted <- cyphr::encrypt_string("my secret string", key)
encrypted_raw <- rawToChar(encrypted)
decrypted_raw <- charToRaw(encrypted_raw)
cyphr::decrypt_string(decrypted_raw, key)
#Expected output: "my secret string"
#Received output: "my secret string"

我如何加密字符串,将其传递给JSON,然后从JSON中检索并解密它之后?由于

jsonlite::toJSON()不接受raw输入。默认情况下,它被编码为base64。因此,当重新导入它时,您需要使用base64enc::base64decode()将base64字符串转换为raw。在那之后,你应该没有问题解码你的秘密。

library(jsonlite)
library(sodium)
library(cyphr)
library(base64enc)
key <- "password123" |> 
charToRaw() |> 
sha256() |> 
key_sodium()
sec <- "my secret string" |> 
encrypt_string(key) 
sec |> 
toJSON() |> 
fromJSON() |> 
base64decode() |> 
decrypt_string(key)
#> [1] "my secret string"

最新更新