首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何用JSON加密JSON对象,用php Libsodium解密

如何用JSON加密JSON对象,用php Libsodium解密
EN

Stack Overflow用户
提问于 2019-12-26 15:21:19
回答 1查看 1.3K关注 0票数 2

我成功地找到了一个用于前端加密的Lib钠js库(JS),并为Lib钠加密/解密设置了我的PHP后端。当我加密JSON对象时,如下所示

代码语言:javascript
复制
const key = "827ccb0eea8a706c4c34a16891f84e7b";
const nonce = "0123456789abcdefghijvbnm";

var credentials = {
       "zip":"265",
       "account_number":"10028979739",
       "passcode":"1234",
       "account_type":"personal",
       "request":"login",
       "device":"iPhone 11"
   };


function encrypt(data){
 return sodium.crypto_secretbox(sodium.encode_utf8(data),nonce,key);
};

function decrypt(data){
 return sodium.decode_utf8(sodium.crypto_secretbox_open(data, nonce, key));
}

function login(data){
$.ajax({
       url:baseURL+"account/account.php",
       method:"POST",
       contentType:"application/x-www-form-urlencoded",
       dataType:"json",
       data:"datax="+JSON.stringify(encrypt(credentials)),
       beforeSend:()=>{
           console.log(credentials);
       },success:(response)=>{
          console.log(response);
       },error:(e)=>{
           swal("Connection Error","Failed to connect to the server!","error");
       }
   });

}

当我用它触发登录方法时,使用encrypt方法加密JSON对象,因此我发送如下所示:

代码语言:javascript
复制
datax: {"0":191,"1":118,"2":248,"3":134,"4":45,"5":163,"6":3,"7":157,"8":78,"9":73,"10":157,"11":137,"12":178,"13":6,"14":68,"15":91,"16":217,"17":219,"18":50,"19":11,"20":127,"21":177,"22":130,"23":25,"24":209,"25":254,"26":210,"27":44,"28":119,"29":13,"30":144}

在php后端代码中,我正在这样做:

代码语言:javascript
复制
<?php
function decrypt($data){
        $key = "e9897cea109576c2f8088c277125d553e4f83afbc0abbb92cfb1f7b776b4fee0";
        $nonce = "0123456789abcdefghijvbnm";
        return sodium_crypto_secretbox_open($data,$nonce,$key);
    }

    function encrypt($data){
        $data = utf8_encode($data);
        $key = "e9897cea109576c2f8088c277125d553e4f83afbc0abbb92cfb1f7b776b4fee0";
        $nonce = "0123456789abcdefghijvbnm";
        return sodium_crypto_secretbox($data,$nonce,$key);
    }


    $credentials = $_POST["datax"];
    echo decrypt($credentials);

    ?>

同样的键,同样的现在,但它没有回音任何东西。我怎么解密这个??

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-12-27 09:07:54

代码需要做一些修改。在JavaScript端(前端):

必须将string.

  • Besides (数据)转换为(数据),同时还必须使用Utf8对nonce和key进行编码。虽然密钥也可以被十六进制编码为16字节键,但在这种情况下,必须将Utf8编码为32字节键,因为sodium.crypto_secretbox需要32字节密钥。现在的数据可以是encrypted.
  • sodium.crypto_secretbox,它以Uint8Array的形式返回数据,因此必须将数据编码为适当的格式,例如hexadecimal.

相应的代码是:

代码语言:javascript
复制
nacl_factory.instantiate(function (sodium) {

    var credentials = {
        "zip":"265",
        "account_number":"10028979739",
        "passcode":"1234",
        "account_type":"personal",
        "request":"login",
        "device":"iPhone 11"
    };

    // Convert JavaScript object to string
    var data = JSON.stringify(credentials);

    // Utf8 encode key, nonce and data
    var keyUtf8 = sodium.encode_utf8("827ccb0eea8a706c4c34a16891f84e7b");
    var nonceUtf8 = sodium.encode_utf8("0123456789abcdefghijvbnm");
    var dataUtf8 = sodium.encode_utf8(data);
   
    // Encrypt
    var encrypted = sodium.crypto_secretbox(dataUtf8, nonceUtf8, keyUtf8);

    // Hex encode encrypted data for transfer 
    var encryptedHex = sodium.to_hex(encrypted);

    console.log("Ciphertext (hex):\n" + encryptedHex.replace(/(.{64})/g, "$1\n"));
});
代码语言:javascript
复制
<script src="https://cdnjs.cloudflare.com/ajax/libs/js-nacl/1.3.2/nacl_factory.js"></script>

在PHP端(后端):

  • 十六进制字符串$encryptedHex必须解码。
  • 解码后的数据将被解密。为此,必须使用密钥和现在的加密。在发布的代码中使用不同的密钥,这在crypto_secretbox (对称加密)上下文中是不可能的,即双方使用相同的密钥。对于不对称加密,有crypto_box
  • 结果可以解码为一个JavaScript对象,其对象可以像往常一样被访问。

相应的代码是:

代码语言:javascript
复制
// Hex decode
$encrypted = sodium_hex2bin($encryptedHex);

// Decrypt
$nonce = "0123456789abcdefghijvbnm";
$key = "827ccb0eea8a706c4c34a16891f84e7b";
$decrypted = sodium_crypto_secretbox_open($encrypted, $nonce, $key);

// Convert to JavaScript object
$decryptedJSON = json_decode($decrypted);
echo "Zip:            " . $decryptedJSON->zip . "\n";
echo "Account number: " . $decryptedJSON->account_number . "\n";
echo "Passcode:       " . $decryptedJSON->passcode . "\n";
echo "Account type:   " . $decryptedJSON->account_type . "\n";
echo "Request:        " . $decryptedJSON->request . "\n";
echo "Device:         " . $decryptedJSON->device . "\n";
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59490307

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档