摘要: 一。什么是散列算法 为了保证密码的安全,我们经常会用到散列算法对密码进行加密。 散列算法的3个特点: 1. 同样的字符串会生成相同的散列值(散列值就是一堆乱七八糟的字符串)。 2. 不同的字符串生成的散列值很有可能不一样。只要对字符串做了一点微小改动,生成的散列值会有天翻地覆的变化。 3. 不能由散 阅读全文
posted @ 2023-01-06 12:07 JeffLiang 阅读(1089) 评论(0) 推荐(0) 编辑

HTTP协议

我们知道HTTP协议是一种无状态的协议(服务器端不知道前后两次请求是否来自于同一个浏览器。所以,用户在第一次请求中登录后再在同一个浏览器中发第二次请求时,服务器并不知道这个用户已经登录了)。为了解决这个问题,就需要用一种机制来保存用户的登录状态/登录信息,常用的机制有Session和JWT.

Session

ASP.NET, ASP.NET MVC和ASP.NET MVC Core都支持用Session用保存用户的登录状态。Session的一种简单实现方式为:用户登录后会在服务器生成一个Session,每个Session里面包含SessionId(用来唯一标识一个Session)和对应的用户信息(如用户名,邮箱,电话等),所有的Session保存在内存的一块区域中。返回请求响应的时候,把SessionId包含到Cookie中,并把Cookie随着HTTP响应发给浏览器。用户下次发出请求的时候,会把包含了SessionId的Cookie发送给服务器,服务器根据Cookie里的SessionId,就知道这个用户已经登录了;根据SessionId和用户信息的对应关系,也可以拿到该用户的用户信息。

Session带来的两个问题:

问题1:在分布式集群架构中(例如当前流行的微服务架构),用户登录后就不能把Session保存到处理登录请求的那台服务器的内存里了,因为下次请求可能是由其它服务器来处理的。为了解决这个问题,可以增加一台Redis或者Memcached中心状态服务器,用来集中保存用户的登录状态。但这样做,相比从内存读取登录状态,性能会更低。

问题2:在分布式集群架构中,客户端可能是微信小程序,也可能是App,这样的客户端不支持或者不方便使用Cookie。

JWT

JWT是一段经过Base64编码后生成的字符串,人看不懂,要经过Base64解码才能看得懂,如下图所示:

 登录到https://jwt.io,把JWT字符串拷贝进去,可以立即看到JWT各个部分的内容,也可以用代码来解码JWT的Header和Payload部分(解码前需要先验签以防止JWT被客户端篡改)。

JWT由Header(头部), Payload(负载), Signature(签名)三部分组成,如下图所示:

头部包含的是签名算法。

负载包含了用户名,过期时间等信息。你可以自己指定包含哪些信息。

签名里面是用签名算法生成的签名字符串。

用户成功登录后,服务器端会生成JWT并返回给客户端,客户端下次发送请求给服务器的时候会在请求头的Authorizaiton部分包含JWT(格式为Bearer JWT)。服务器收到请求后,会先把用户提交的JWT中的Header和Payload取出来,然后用服务器才知道的密钥按如下方式生成签名,并把生成的签名字符串和JWT中的签名字符串做比较,如果相等则认为用户已经登录,然后才会去拿Payload里面的用户信息。

HMACSHA256(
base64UrlEncode(header) + "." +
base64UrlEncode(payload),
your-256-bit-secret
)

由于JWT是保存在客户端,所以不会存在Session在分布式架构中出现的两个问题。

因为服务器每次都会检查签名,所以防止了JWT在客户端被篡改。

 

posted @ 2023-01-06 14:41 JeffLiang 阅读(503) 评论(0) 推荐(1) 编辑
摘要: 前面有朋友发表过一篇名为“你看不懂的抽象类和接口的区别 ”的博文,我觉得作者博客的内容没有很好的诠释“你看不懂的抽象类和接口的区别”这个标题。我来说说自己的看法。先举个例子,以方便大家理解,然后从例子中抽象概括出结论。比如,一家生产门的公司,需要先定义好门的模板,以便能快速生产出不同规格,功能的门。 这里的模板通常会有两类模板:抽象类模板和接口模板。抽象类模板:这个模板里面应该包含所有门都应该具有的共同属性(如,门的形状和颜色等)和共同行为(如,开门和关门)。接口模板:有些门可能需要具有报警和指纹识别等功能,但这些功能又不是所有门必须具有的,所以像这样的行为应该放在单独的接口中(如,带有报警功 阅读全文
posted @ 2011-04-30 21:24 JeffLiang 阅读(2126) 评论(14) 推荐(4) 编辑
摘要: 我以前都是用C#来写,这次搞这个VB.NET项目,有点突然。还好语言都是相通的。1.虽说以前的Microsoft Visual Basic和.NET都是微软自己的东西,可有很多功能的实现方式还不一样,特别是那些控件。2.每个程序都会有自己的业务逻辑,有些可能会很复杂,甚至读别人的代码时你可能对业务逻辑那部分会完全一头雾水。开始也打算在.NET环境下重做,可在做了一些尝试后发现根本没法了解那个VB6... 阅读全文
posted @ 2009-10-09 12:10 JeffLiang 阅读(7212) 评论(3) 推荐(1) 编辑
点击右上角即可分享
微信分享提示