在WebApi后端加密Json结果

我用数据描述完成了我的web api,但现在,我必须编写Json结果。 当我在浏览器上放置查询字符串时,现在我有了答案(示例):

[{ “SUSPID”: “111”, “IVNOME”: “睾丸中”, “IVMAE”: “睾丸中”, “IVPAI”: “睾丸中”, “IVDATANASC”: “1970年2月7日”, “IVRG”: “0000(IFP)”,“ICPF”:“NãoCadastrado”}]

我无法certificate这一点……我必须表现出(加密):[{“SUSPID”:“AUAUAUA”,“IVNOME”:“UAUAU”,“IVMAE”:“UAUAU”,……]

我看到一些例子,但我找不到一个我需要的东西

我服务的部分代码(Cliente-side):

var response = await client.GetAsync(urllink); var JsonResult = response.Content.ReadAsStringAsync().Result; if (typeof(T) == typeof(string)) return null; var rootobject = JsonConvert.DeserializeObject(JsonResult); return rootobject; 

在我的控制器(web api BackEnd)中,我返回此数据集:

 return lretorno.Tables[0].AsEnumerable().Select(row => new Envolvido { SUSPID = Convert.ToString(row["SUSPID"]), IVNOME = Convert.ToString(row["SUSPNOME"]), IVMAE = Convert.ToString(row["SUSPMAE"]), IVPAI = Convert.ToString(row["SUSPPAI"]), IVDATANASC = Convert.ToString(row["SUSPDATANASC"]).Replace(" 00:00:00", ""), IVRG = Convert.ToString(row["RG"]), ICPF = Convert.ToString(row["CPF"]), MANDADO = Convert.ToInt16(row["TEMMANDADO"]), OCORRENCIA = Convert.ToInt16(row["TEMOCORRENCIA"]), }); 

我无法理解我必须在哪里编写内容以及我必须在代码上解密的地方。

如果你真的必须在https之上做一些额外的加密,例如,如果你想帮助停止自动化的中间人你可以做类似下面的事情……这将需要中间人 (政府,ISP) ,Telco,Endpoint网络管理员)通过弄清楚你如何传递额外的公钥,在中间攻击中做第二个人。 除此之外,您还可以在加密之前在JSON中包含“pk”参数…然后当您解密json时,您可以将它与您发送的公钥进行比较,如果它们不匹配则确定有一个中间人。 我使用了内置的RSACryptoServiceProvider 。

客户端

 // Generate private and public keys (use any asymmetric crypto/key size you want) RSACryptoServiceProvider rsaKeys = new RSACryptoServiceProvider(); var privateXmlKeys = rsaKeys.ToXmlString(true); var publicXmlKeys = rsaKeys.ToXmlString(false); // Make the request for the json data from the server, and also pass along the public xml keys encoded as base64 var response = await http.GetAsync(new Uri(String.Format("https://example.com/data?id=777&pk=\"{0}\"", Convert.ToBase64String(Encoding.ASCII.GetBytes(publicXmlKeys))))); var encryptedJsonBytes = await response.Content.ReadAsByteArrayAsync(); // Decrypt the bytes using the private key generated earlier RSACryptoServiceProvider rsaDecrypt = new RSACryptoServiceProvider(); rsaDecrypt.FromXmlString(privateXmlKeys); byte[] decryptedBytes = rsaDecrypt.Decrypt(encryptedJsonBytes, false); // Now change from bytes to string string jsonString = Encoding.ASCII.GetString(decryptedBytes); // TODO: For extra validation, parse json, get the public key out that the server // had used to encrypt, and compare with the "pk" you sent "publicXmlKeys", // if these values do not match there was an attack. 

服务器端

 // Assuming you have your JSON string already string json = "{\"key\":\"secret_value\"}"; // Get the "pk" request parameter from the http request however you need to string base64PublicKey = request.getParameter("pk"); string publicXmlKey = Encoding.ASCII.GetString(Convert.FromBase64String(base64PublicKey)); // TODO: If you want the extra validation, insert "publicXmlKey" into the json value before // converting it to bytes // var jo = parse(json); jo.pk = publicXmlKey; json = jo.ToString(); // Convert the string to bytes byte[] jsonBytes = Encoding.ASCII.GetBytes(json); // Encrypt the json using the public key provided by the client RSACryptoServiceProvider rsaEncrypt = new RSACryptoServiceProvider(); rsaEncrypt.FromXmlString(publicXmlKey); byte[] encryptedJsonBytes = rsaEncrypt.Encrypt(jsonBytes, false); // Send the encrypted json back to the client return encryptedJsonBytes; 

如果您需要在中间攻击中防止人员,那么我建议您通过不同的方法关闭计算机或预先共享密钥,而不是通过互联网,电话或邮件,然后不要将其嵌入到您的应用程序中:P Take查看非正式记录 , 端到端加密和Diffie-Hellman密钥交换

基本上我对你有一些关于这类案例的一般性想法。 如果你知道中间人攻击中的人 ,只有在E2E连接中你可以依赖你的encryption算法,那是因为只有这些端点有私钥和公钥而且攻击者不能欺骗,但在这些情况下(比如你的case)攻击者可以简单地拥有你的公钥,甚至是你想要发送到你的web服务的加密块,那是因为你在客户端拥有的只是每个人都可以阅读的javascript资源。 因此,我能给你的唯一解决方案就是将你的web服务放在通常处理这类问题的HTTPS协议上,而你不需要任何加密。 问候。