asp.net-mvc – ASP.Net MVC和WebAPI加密
|
我想利用某种形式的“简单”加密,这种加密相当安全,但对开发过程的影响非常低. 假设我在客户端中拥有对话的双方<>网络服务情况.我的应用程序是Windows phone / win8 / silverlight /桌面应用程序,服务器是ASP.Net MVC或WebAPI. 在我看来,我想要一些简单的事情: – <security encryption="off|sometype|someothertype">
<privatekey>12345MyKey54321</privatekey>
</security>
作为客户端和服务器上的某种形式的配置参数.此外,身份验证例程将返回并存储某种形式的公钥. 这样做将启用“加密模式”并导致任何http请求被加密和放大.使用提供的键以选定的方式进行散列.如果没有密钥和解密方法,最终结果是在本地,代理或远程计算机上嗅到的任何东西都将无法查看数据.在服务器上,在执行控制器操作之前,使用相同的密钥对数据进行解密. 比换出的HttpRequest / WebClient的呼吁像EncryptedHttpRequest并增加对事物的MVC /侧的WebAPI适当挂钩,所有其他的客户端代码和控制器动作将是无知的事实数据进行加密. 我错过了什么或者设置不是这么简单吗?就我所搜索的而言,没有任何东西可以提供这种简洁程度,所以我认为我在逻辑中缺少一些差距? 解决方法我成功完成了这个.它并不太难,效果很好.我用它来激活产品的许可证.最重要的是,您真正控制客户端和服务器 – 没有人可以从客户端的代码中提取您的私钥.步骤1:创建不带参数的MVC控制器操作方法: [HttpPost] public ActionResult Activate() { ... }
步骤2:在控制器中,只需使用HttpRequest.InputStream来获取客户端发送的字节数. var stream = this.HttpContext.Request.InputStream; 步骤3:创建CryptoStream以反序列化. 我已经在这里创建了加密和解密示例. sharedSecret是一个足够长度(512字节)随机字节的byte [] – 这是你保护的! public CryptoStream CreateEncryptionStream(Stream writeStream)
{
TripleDESCryptoServiceProvider cryptoProvider = new TripleDESCryptoServiceProvider();
PasswordDeriveBytes derivedBytes = new PasswordDeriveBytes(this._sharedSecret,null);
CryptoStream cryptoStream = new CryptoStream(writeStream,cryptoProvider.CreateEncryptor(derivedBytes.GetBytes(16),derivedBytes.GetBytes(16)),CryptoStreamMode.Write);
return cryptoStream;
}
public CryptoStream CreateDecryptionStream(Stream readStream)
{
TripleDESCryptoServiceProvider cryptoProvider = new TripleDESCryptoServiceProvider();
PasswordDeriveBytes derivedBytes = new PasswordDeriveBytes(this._sharedSecret,null);
CryptoStream cryptoStream = new CryptoStream(readStream,cryptoProvider.CreateDecryptor(derivedBytes.GetBytes(16),CryptoStreamMode.Read);
return cryptoStream;
}
第4步:使用您的CryptoStream另一个流阅读器进行解密. 我使用XmlReader,以便我所有现有的序列化代码都可以清除(在读取/写入服务器上的磁盘或数据库时)或加密(发送时). using (var reader = XmlReader.Create(decryptionStream,settings)) { ... }
第5步:在控制器中制定安全响应. 这与步骤1-4相反,以加密您的响应对象.然后,您只需将加密的响应写入内存流并将其作为文件结果返回.下面,我已经展示了如何为我的许可响应对象执行此操作. var responseBytes = GetLicenseResponseBytes(licenseResponse);
return File(responseBytes,"application/octet-stream");
private byte[] GetLicenseResponseBytes(LicenseResponse licenseResponse)
{
if (licenseResponse != null)
{
using (MemoryStream memoryStream = new MemoryStream())
{
this._licenseResponseSerializer.Write(memoryStream,licenseResponse);
return memoryStream.ToArray();
}
}
return null;
}
第6步:实施客户端请求响应. 您可以使用HttpWebRequest或WebClient类来制定请求.以下是我使用的代码中的几个示例. byte[] postBytes = GetLicenseRequestBytes(licenseRequest);
HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(licenseServerUrl);
request.Method = "POST";
request.ContentType = "application/octet-stream";
request.Proxy = WebRequest.DefaultWebProxy;
using (Stream requestStream = request.GetRequestStream())
{
requestStream.Write(postBytes,postBytes.Length);
}
return request;
private LicenseResponse ProcessHttpResponse(HttpWebResponse response)
{
if ((response.StatusCode == HttpStatusCode.OK) && response.ContentType.Contains("application/octet-stream"))
{
var stream = response.GetResponseStream();
if (stream != null)
{
var licenseResponse = this._licenseResponseSerializer.Read(stream);
return licenseResponse;
}
}
return new LicenseResponse(LicensingResult.Error);
}
摘要和提示 >使用客户端和服务器上的请求/响应中的流来传递二进制八位字节流数据>使用CryptoStream和加密算法(考虑使用最强的加密功能)和一个好的私钥来在序列化/反序列化时加密数据.>确保检查大小并将所有传入数据格式化到客户端和服务器(避免缓冲区溢出并尽早抛出异常)>如果可能,使用模糊处理保护客户端上的私钥(请查看DeepSea obfustactor) (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 在asp.net App_Code目录中使用Nemerle
- ASP.NET和C#有什么区别?
- asp.net – Oracle中的参数化查询问题
- asp.net-mvc – 在ASP.NET MVC中使用控制器和用户控件设置活
- asp.net-mvc – 在ASP.NET MVC项目中访问elmah.axd时出现“
- asp.net – 通过javascript从代码后面访问变量
- asp.net-mvc – 401在MVC API中使用Microsoft Azure Active
- asp.net-web-api – 如何使用OWIN自动主机的web api来提供i
- 如何测量Live ASP.NET MVC Web应用程序的内存使用情况?
- asp.net – FormsAuthentication.GetRedirectUrl始终返回默
- 何时在ASP.NET上选择LAMP?
- 从asp.net中的代码编写Html标记
- asp.net Web.config 详细配置说明
- asp.net-mvc – 首先通过NuGet尝试StructureMap和
- asp.net-mvc – 与SmtpClient.UseDefaultCredent
- asp.net – jQuery AJAX vs. UpdatePanel
- asp.net-mvc – ASP.Net 5 project.json脚本命令
- asp.net – LinkButton不会在click()上调用
- asp.net-mvc – System.Data.SqlClient.SqlExcep
- asp.net-mvc – 为什么不在ASP.NET MVC项目的Con
