R语言加密字符串转JSON后解密失败的解决方法求助
解决加密字符串转JSON后解密失败的问题
问题出在直接将加密后的原始字节(raw对象)转成普通字符串时,会包含JSON无法安全处理的不可打印控制字符,导致序列化/反序列化后字节信息丢失或篡改。正确的做法是用Base64编码把加密后的字节转换成纯文本字符串,再进行JSON处理。
完整可行流程代码
# 加载所需包 library(cyphr) library(jsonlite) library(base64enc) # 用于Base64编解码 # 1. 生成密钥 key <- key_sodium(sha256(charToRaw("password123"))) # 2. 加密字符串得到原始字节 encrypted_raw <- encrypt_string("my secret string", key) # 3. 将加密字节转换为Base64编码的纯文本字符串(关键步骤) encrypted_b64 <- base64encode(encrypted_raw) # 4. 转换为JSON格式,可安全发送到数据库/前端 json_encrypted <- toJSON(encrypted_b64) # 5. 模拟从数据库取回JSON并解析 json_decrypted <- fromJSON(json_encrypted) # 6. 将Base64字符串转回原始加密字节 restored_raw <- base64decode(json_decrypted) # 7. 解密得到原始字符串 decrypted_string <- decrypt_string(restored_raw, key) print(decrypted_string) # 输出: "my secret string"
为什么原方法失效?
加密后的原始字节包含大量非可打印的控制字符(比如ASCII码0-31的字符),rawToChar()虽然能把这些字节转成字符串,但JSON在序列化这类字符串时,会对特殊字符进行转义(比如\0、\x01等),而反序列化时无法完全还原原始字节,导致解密时的字节与加密时不一致,最终解密失败。
Base64编码会把所有原始字节映射到64个可打印的ASCII字符(字母、数字、+、/),完全兼容JSON的文本处理规则,不会出现信息丢失或篡改,因此能保证加密数据在JSON传输前后的一致性。
内容的提问来源于stack exchange,提问作者aleksandereiken
相关产品推荐
相关产品推荐

