Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

第 61 题:介绍下如何实现 token 加密 #106

Open
zeroone001 opened this issue Apr 23, 2019 · 14 comments
Open

第 61 题:介绍下如何实现 token 加密 #106

zeroone001 opened this issue Apr 23, 2019 · 14 comments

Comments

@zeroone001
Copy link

No description provided.

@jjeejj
Copy link
Contributor

jjeejj commented Apr 24, 2019

这个题目是问: 生成token的方法,比如 JWT,还是说利用加密算法,比如对称加密或者非对称加密 加密生成后的token ?

@y1324
Copy link

y1324 commented Apr 24, 2019

加点随机数算法,后台配合对应解密算法。

@lvwxx
Copy link

lvwxx commented Apr 24, 2019

jwt举例

  1. 需要一个secret(随机数)
  2. 后端利用secret和加密算法(如:HMAC-SHA256)对payload(如账号密码)生成一个字符串(token),返回前端
  3. 前端每次request在header中带上token
  4. 后端用同样的算法解密

@haiifeng
Copy link

jwt举例

  1. 需要一个secret(随机数)
  2. 后端利用secret和加密算法(如:HMAC-SHA256)对payload(如账号密码)生成一个字符串(token),返回前端
  3. 前端每次request在header中带上token
  4. 后端用同样的算法解密

这边也是这么做的,后端根据token来查权限和是否登录以及失效等

@yiqingfeng
Copy link

token 加密方式:

  • 服务器通过私钥对一部分信息进行加密生成签名,并将签名和数据拼接在一起作为 token 的一部分。例如 JWT。
  • 使用客户端的 UA 或其他数据作为干扰码对 token 进行加密。

相关参考文章:

@xbcc123
Copy link

xbcc123 commented Apr 24, 2019

  1. token加密主要是来做客户端和服务端的用户信息校验
  2. 服务端生成随机数,用户登录会将随机数告知客户端,并自己在缓存空间保留一份,每次客户端发送> token,服务端会对比缓存空间是否有此token,来判断用户是否存在
  3. 当确定token存在,进行下一步校验...,最后通过token拿取客户端需要的信息
  4. 加密方法:JWT,AES, DES... 或者直接就是随机字符串

@haiifeng
Copy link

@zeroone001 不是很清楚的知道这道题答案是啥了。。。

@1023mo
Copy link

1023mo commented Apr 25, 2019

后端通过随机数加签名生成一个token,前端拿到token后通过拦截器在接口调用时添加token。

@LoCielsys
Copy link

认识JWT

@daiyunchao
Copy link

后端 使用一个固定秘钥加密用户标识(uid)+创建token时间(ttl) 通过对称加密(收到客户端提交的token需要解开所有使用堆成加密)的加密算法生成一个字符串,这个字符串就是一个token,每次客户端请求都将token放到请求头header中(body参数也可以,无所谓在哪),服务器端收到该请求并使用相同的秘钥解开token,查看token是否过期,也可以通过token中的uid和其他参数比较验证用户的合法性(例如:请求参数中也有一个uid必填参数,这样就可以对比两个uid是否相同,如果相同则说明是同一个人,如果单纯的只验证token,只要另外的用户拿到了没过期的token就可以伪造用户身份进行服务器端api的请求)

@Gumplefik
Copy link

这篇应该主要问的是token是怎么生成的:
加密看设计架构了,
一类存储token关联用户使用不可逆加密算法,像md5之类的
二类token内包含用户基础信息则要采用可逆算法,各种可解密算法都可以

认证方案:
JWT认证token是无法做到自注销的
session内存相关开销太大,不适合分布式,还有CSRF的问题

@Marcuslyj
Copy link

token为什么要加密?

@keephungryHF
Copy link

来自知乎饥人谷若愚的图片,点击预览

@shifengdiy
Copy link

shifengdiy commented Aug 8, 2021

传统身份验证的方法
HTTP 是一种没有状态的协议,也就是它并不知道是谁是访问应用。这里我们把用户看成是客户端,客户端使用用户名还有密码通过了身份验证,不过下回这个客户端再发送请求时候,还得再验证一下。

解决的方法就是,当用户请求登录的时候,如果没有问题,我们在服务端生成一条记录,这个记录里可以说明一下登录的用户是谁,然后把这条记录的 ID 号发送给客户端,客户端收到以后把这个 ID 号存储在 Cookie 里,下次这个用户再向服务端发送请求的时候,可以带着这个 Cookie ,这样服务端会验证一个这个 Cookie 里的信息,看看能不能在服务端这里找到对应的记录,如果可以,说明用户已经通过了身份验证,就把用户请求的数据返回给客户端。

上面说的就是 Session,我们需要在服务端存储为登录的用户生成的 Session ,这些 Session 可能会存储在内存,磁盘,或者数据库里。我们可能需要在服务端定期的去清理过期的 Session 。

基于 Token 的身份验证方法
使用基于 Token 的身份验证方法,在服务端不需要存储用户的登录记录。大概的流程是这样的:

  1. 客户端使用用户名跟密码请求登录
  2. 服务端收到请求,去验证用户名与密码
  3. 验证成功后,服务端会签发一个 Token,再把这个 Token 发送给客户端
  4. 客户端收到 Token 以后可以把它存储起来,比如放在 Cookie 里或者 Local Storage 里
  5. 客户端每次向服务端请求资源的时候需要带着服务端签发的 Token
  6. 服务端收到请求,然后去验证客户端请求里面带着的 Token,如果验证成功,就向客户端返回请求的数据

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests