目录
一:Token和MD5分别是什么
1:Token
2:MD5
二:简易Token的实现
1:Base64。
2:验证Token
三:MD5的使用
一:Token和MD5分别是什么
1:Token
Token 的中文有人翻译成 “令牌”,意思就是,你拿着这个令牌,才能过一些关卡。
Token 是一个用户自定义的任意字符串。在成功提交了开发者自定义的这个字符串之后,Token 的值会保存到服务器后台。只有服务器和客户端前端知道这个字符串,于是 Token 就成了这两者之间的密钥,它可以让服务器确认请求是来自客户端还是恶意的第三方。使用基于 Token 的身份验证方法,在服务端不需要存储用户的登录记录。大概的流程是这样的:
1) 客户端使用用户名跟密码请求登录
2) 服务端收到请求,去验证用户名与密码
3) 验证成功后,服务端生成一个 Token,这个 Token 可以存储在内存、磁盘、或者数据库里,再把这个 Token 发送给客户端
4) 客户端收到 Token 以后可以把它存储起来,比如放在 Cookie 里或者 Local Storage
5) 客户端每次向服务端请求资源的时候需要带着服务端签发的 Token6) 服务端收到请求,然后去验证客户端请求里面带着的 Token,如果验证成功,就向客户端返回请求的数据
2:MD5
MD5 即 Message-Digest Algorithm 5(信息-摘要算法 5),用于确保信息传输完整一致。是计算机广泛使用的杂凑算法之一(又译摘要算法、哈希算法),主流编程语言普遍已有 MD5 实现。
理论上 MD5 是不可逆的,而且 MD5 本来也不是作加密使用,而是用来校验数据的完整性,只是因为其不可逆且稳定、快速的特点,被广泛用于对明文密码的加密。
但是简单密码来说,破解者完全可以将一定范围内的密码字典全部计算出来之后存为数据库,之后直接查询进行破解。
用户重要信息(如密码)不应该明文保存到数据库,可以通过 MD5 加密后再保存:
二:简易Token的实现
1:Base64。
用记事本打开 exe、jpg、pdf 这些文件时,我们都会看到一大堆乱码,因为二进制文件包含很多无法显示和打印的字符。当不可见字符在网络上传输时,比如说从 A 计算机传到 B 计算机,往往要经过多个路由设备,由于不同的设备对字符的处理方式有一些不同,这样那些不可见字符就有可能被处理错误,这是不利于传输的。
为了解决这个问题,我们可以先对数据进行编码,比如 编码,变成可见字符,也就是 ASCII 码可表示的可见字符,从而确保数据可靠传输。 的内容是有 0 ~ 9,a ~ z,A ~ Z,+,/ 组成,正好 64 个字符,这些字符是在 ASCII 可表示的范围内,属于 95 个可见字符的一部分。
所以,如果要让记事本这样的文本处理软件能处理二进制数据,如使用 json 保存二进制信息,需要先把数据先做一个 Base64 编码,统统变成可见字符,再保存。在 Base64 中的可打印字符包括大写英文字母 A-Z、小写英文字母 a-z、阿拉伯数字 0-9,这样共有 62个字符,此外两个可打印符号在不同的系统中而不同,通常用加号(+)和正斜杠(/)。外加“补全符号”,通常用等号(=)。
Base64 是一种用 64 个字符来表示任意二进制数据的方法,常用于在 URL、Cookie、网页中传输少量二进制数据。Base64 要求把每三个 8Bit 的字节转换为四个 6Bit 的字节(3*8 = 4*6 = 24),然后把 6Bit 再添两位高位 0,组成四个 8Bit 的字节,也就是说,转换后的字符串理论上将要比原来的长 1/3。
在下面的Token生成中,我们使用了随机数字和Base64的算法。
string RandomString(const int len) /*参数为字符串的长度*/
{/*初始化*/string str; /*声明用来保存随机字符串的str*/char c; /*声明字符c,用来保存随机生成的字符*/int idx; /*用来循环的变量*//*循环向字符串中添加随机生成的字符*/for (idx = 0; idx < len; idx++) {/*rand()%26是取余,余数为0~25加上'a',就是字母a~z,详见asc码表*/c = 'a' + rand() % 26;str.push_back(c); /*push_back()是string类尾插函数。这里插入随机字符c*/}return str; /*返回生成的随机字符串*/
}int main()
{string Token = RandomString(32);}
2:验证Token
我们将这个Token存储到redis中,因为这个Token需要频繁验证。所以验证前我们要连接redis,拿取他的Token,如果对应上说明是同一个用户。
//验证登陆token,成功返回0,失败-1
int VerifyToken(string &user_name, string &token) {int ret = 0;CacheManager *cache_manager = CacheManager::getInstance();// increase message countCacheConn *cache_conn = cache_manager->GetCacheConn("token");AUTO_REL_CACHECONN(cache_manager, cache_conn);if (cache_conn) {string tmp_token = cache_conn->Get(user_name);if (tmp_token == token) {ret = 0;} else {ret = -1;}} else {ret = -1;}return ret;
}
三:MD5的使用
网上的MD5的实现非常多还很复杂,这里就不进行讲解了,我们主要是来学会使用这个md5.下面这个网址是在线的一个md5生成网站。我们可以使用这个来对我们的密码进行加密。
md5在线解密破解,md5解密加密
我们既然知道了md5的作用后,那我们写程序的时候,我们对于服务端注册账号的时候,我们不应该存储明文密码,而是存储md5加密后的,我们可以将md5生成给嵌入到程序中。我们可以把密码给加密三次或着多次后,再写到服务器中。这样可以加大破解时间。0voice · GitHub