Зашифруйте результат Json на сервере WebApi
Я закончил свой веб-интерфейс с описаниями данных, но теперь я должен записать результат Json. Когда я поместил строку запроса в браузер, теперь у меня есть ответ (пример):
[{ "SUSPID": "111", "IVNOME": "Teste","IVMAE":"Teste", "IVPAI": "Teste","IVDATANASC":"02/07/1970","IVRG":"0000 (IFP)","ICPF":"Não Cadastrado"}]
Я не могу показать это... я должен показать как (ЗАКРЫТО): [{"SUSPID":"AUAUAUA","IVNOME":"UAUAU","IVMAE":"UAUAU", ......]
Я вижу некоторые примеры, но я не нахожу того, что мне нужно
Часть кода моего сервиса (на стороне клиента):
var response = await client.GetAsync(urllink);
var JsonResult = response.Content.ReadAsStringAsync().Result;
if (typeof(T) == typeof(string))
return null;
var rootobject = JsonConvert.DeserializeObject<T>(JsonResult);
return rootobject;
И на моем контроллере (веб-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"]),
});
Я не могу понять, где я должен зашифровать и где я должен расшифровать код.
2 ответа
Если вам действительно нужно выполнить какое-то дополнительное шифрование поверх https, например, если вы хотите помочь остановить автоматизированный человек-посредник, вы можете сделать что-то вроде следующего... для этого потребуются промежуточные люди (правительство, провайдер, Telco, администратор сети Endpoint), чтобы сделать второго человека в середине атаки, выяснив, как именно вы передаете свой дополнительный открытый ключ. В дополнение к этому вы также можете включить параметр "pk" в свой JSON до того, как он будет зашифрован... и затем, когда вы расшифруете 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 Возьмите взгляд на запись, сквозное шифрование и обмен ключами Диффи-Хеллмана
По сути, у меня есть некоторые общие идеи о подобных случаях для вас. Если вы знаете о Человеке в середине атаки, только в E2E
соединение, на которое вы можете положиться encryption
Это потому, что только у этих конечных точек есть закрытый и открытый ключи, и злоумышленник не может подделать, но в этих случаях (как и в вашем случае) злоумышленник может просто иметь ваш открытый ключ и даже зашифрованный блок, который вы пытаетесь использовать. отправить на ваш веб-сервис, потому что все, что у вас есть на стороне клиента, - это ресурсы javascript, которые могут прочитать все. Так что единственное решение, которое я могу вам дать, - это использовать ваши веб-сервисы на HTTPS
протоколы, которые обычно решают такие проблемы, и вам не нужно шифрование. С уважением.