C# 在ASP.NET MVC中加密以Json格式发送的数据

C# 在ASP.NET MVC中加密以Json格式发送的数据,c#,json,ajax,asp.net-mvc,C#,Json,Ajax,Asp.net Mvc,我希望通过JSON从SQL Server传递大量数据,这样我就可以从客户端对其进行Ajax调用。我刚刚开始使用Ajax,所以我正在做一些基本的示例——根据这些示例,人们可以很容易地查看(例如,在Fiddler中)发送的整个JSON。如何对传递的数据进行加密,以便视图可以使用它,但不会向公众公开?是否可行?如果可行,如何实现 下面是我在练习中使用的一些代码。如果我能从这个基本的例子中得到一些想法,或者被重定向到一本好的读物上,这两个选项都会非常有用 控制器 public JsonResult Ou

我希望通过JSON从SQL Server传递大量数据,这样我就可以从客户端对其进行Ajax调用。我刚刚开始使用Ajax,所以我正在做一些基本的示例——根据这些示例,人们可以很容易地查看(例如,在Fiddler中)发送的整个JSON。如何对传递的数据进行加密,以便视图可以使用它,但不会向公众公开?是否可行?如果可行,如何实现

下面是我在练习中使用的一些代码。如果我能从这个基本的例子中得到一些想法,或者被重定向到一本好的读物上,这两个选项都会非常有用

控制器

public JsonResult OutputToJson() {
    var students =  _db.Students.ToList();
    return Json(students, JsonRequestBehavior.AllowGet);
}
查看


$(文档).ready(函数(){
$('btnGetStudents')。单击(函数(){
$.getJSON(“/Student/OutputToJson”),null,函数(数据){
var div=$(“#AjaxDiv”);
$。每个(数据、功能(i、项){
div.append(“行:+i+”名称:+item.name+”,级别:+item.grade)
})
})
})
})

答案很简单:客户的一切都应该是公开的,客户可以使用

您不应该在客户端实现任何“加密”,老实说,您将无法做到这一点,因为客户端也可以读取您的JavaScript,包括加密算法和密钥

您应该只向您的视图提供公共数据,这样您就不会为其披露而烦恼

可以创建ViewModel并传递它。视图模型仅表示要在视图/页面上显示的数据。
例如,根据您的数据模型和业务逻辑,实现类
StudentViewModel
,该类与
Student
相同,但仅具有公共字段:

public class Student { /* Shouldn't be disclosed */
    public int Id { get; set; }
    public int Grade { get; set; }
    public string PasswordHash { get; set; }
    public string Email { get; set; }
}

public class StudentViewModel { /* Why should I be worried about ids and grades? */
    public int Id { get; set; }
    public int Grade { get; set; }
}

然后,您可以安全地返回
StudentViewModel
数组,而不用担心它。用户将在他的HTML中看到ID和等级,如果他查看开发人员工具网络日志,他将看到ID和等级,其他什么都看不到。

答案很简单:客户端的所有内容都应该是公开的,并且对客户端可用

您不应该在客户端实现任何“加密”,老实说,您将无法做到这一点,因为客户端也可以读取您的JavaScript,包括加密算法和密钥

您应该只向您的视图提供公共数据,这样您就不会为其披露而烦恼

可以创建ViewModel并传递它。视图模型仅表示要在视图/页面上显示的数据。
例如,根据您的数据模型和业务逻辑,实现类
StudentViewModel
,该类与
Student
相同,但仅具有公共字段:

public class Student { /* Shouldn't be disclosed */
    public int Id { get; set; }
    public int Grade { get; set; }
    public string PasswordHash { get; set; }
    public string Email { get; set; }
}

public class StudentViewModel { /* Why should I be worried about ids and grades? */
    public int Id { get; set; }
    public int Grade { get; set; }
}

然后,您可以安全地返回
StudentViewModel
数组,而不用担心它。用户将在其HTML中看到ID和等级,如果他查看开发人员工具网络日志,他将看到ID和等级,而不是其他内容。

我建议使用ssl进行通信。确保http连接是安全的,即它是http so(安全的)。并启用某种形式的身份验证,以确保除了目标用户(已验证)之外,没有人可以调用webapi调用来检索数据

这样,任何拦截请求的人都不能以纯文本的形式查看数据

这可能仅仅是配置web应用程序(即,没有代码更改)的问题,您的JavaScript代码也绝对没有更改

请查看以下内容,以获取有关保护webapi的更多详细信息

我建议使用ssl进行通信。确保http连接是安全的,即它是http so(安全的)。并启用某种形式的身份验证,以确保除了目标用户(已验证)之外,没有人可以调用webapi调用来检索数据

这样,任何拦截请求的人都不能以纯文本的形式查看数据

这可能仅仅是配置web应用程序(即,没有代码更改)的问题,您的JavaScript代码也绝对没有更改

请查看以下内容,以获取有关保护webapi的更多详细信息

您所展示的示例显示了您在视图中返回的json数据,那么加密它有什么意义呢?这里我只传递了部分数据,但如果我感知整个数据库,那就像是将其送出,这是我不想做的。为什么要发送视图不使用的数据来降低应用程序的性能?只需发送您在视图中显示的数据-
var data=students.Select(s=>new{Name=s.Name,Grade=s.Grade});返回Json(数据,…)这是一个很好的观点,和其他观点一样-让我很清楚应该关注什么。谢谢你,Stephen。你展示的示例显示了你在视图中返回的json数据,那么加密它有什么意义呢?这里我只传递了部分数据,但如果我感知整个数据库,那就像是把它泄露出去,这是我不想做的。为什么要发送视图不使用的数据来降低应用程序的性能?只需发送您在视图中显示的数据-
var data=students.Select(s=>new{Name=s.Name,Grade=s.Grade});返回Json(数据,…)这是一个很好的观点,和其他观点一样-让我很清楚应该关注什么。谢谢你,史蒂芬。谢谢你,这也是另一件需要考虑的事情。谢谢,这也是另一件需要考虑的事情。