发表于: 2017-11-08 22:41:08
2 795
今日完成:
1)MD5加密算法的实现。
什么是MD5算法?
MD5的全称是Message-Digest Algorithm 5,算法原理为MD5以512位分组来处理输入的信息,且每一分组又被划分为16个32位子分组,经过了一系列的处理后,算法的输出由四个32位分组组成,将这四个32位分组级联后将生成一个128位散列值。
在MD5算法中,首先需要对信息进行填充,使其位长对512求余的结果等于448。因此,信息的位长(Bits Length)将被扩展至N*512+448,N为一个非负整数,N可以是零。填充的方法如下,在信息的后面填充一个1和无数个0,直到满足上面的条件时才停止用0对信息的填充。然后,在这个结果后面附加一个以64位二进制表示的填充前信息长度。经过这两步的处理,信息的位长=N*512+448+64=(N+1)*512,即长度恰好是512的整数倍,满足后面处理中对信息长度的要求。
MD5算法的实现
public class MD5Utils {
public static final String KEY_MD5="MD5";
//注意:MD5生成的码是128位的!!
public static String Md5Encode(String inputStr){
String result=null;
try {
MessageDigest messageDigest=MessageDigest.getInstance(KEY_MD5);
messageDigest.update(inputStr.getBytes());
/**
* 生成16个byte,总共为128位
*/
byte[]bytes=messageDigest.digest();
System.out.println(bytes.length);
/**
* 转为String输出
*/
StringBuilder stringBuilder=new StringBuilder();
for(byte num :bytes){
//防止精度丢失
int value=num&0xFF;
if (value<16){
stringBuilder.append(0);
}
stringBuilder.append(value);
}
return stringBuilder.toString();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return null;
}
public static void main(String args[]){
String password="12323";
System.out.println( MD5Utils.Md5Encode(password));
}
}
今天困扰我的是这个int value=num&0xFF。首先,要认识到MD5算法是128位的,通过内置的MD5生成的是16个8byte的数。把这个转为String的时候,如果小于16,那么其数值对应的二进制就可以只用四位表示,所以如果小于16就加上0.
2)Token的学习
什么是Token:Token是服务端生成的一串字符串,以作客户端进行请求的一个令牌,当第一次登录后,服务器生成一个Token便将此Token返回给客户端,以后客户端只需带上这个Token前来请求数据即可,无需再次带上用户名和密码。
为什么使用Token:Token的目的是为了减轻服务器的压力,减少频繁的查询数据库,使服务器更加健壮。
Token与Session跟Cookie的区别:
Cookie是保存在客户端,由服务器生成。下一次请求网站的时候可以把Cookie中的内容全部给网站服务器发送过去
Session是在服务器端生成的。服务器为每一个请求者建立一个Session(会话),每一一个用户都有一个单独的session,其标识放在Cookie中,并且每次用户访问完关闭浏览器后,session都被撤销。但是对于做了负载均衡的服务器来说,这样就不太方便了,因为你在一台服务器上生成了session,下次可能访问另外一台服务器。但是如果某个黑客窃取了那个唯一标识(Sessionid),就会出问题了。
Token是用户身份的验证方式。它比session更加灵活,并且更加安全。(具体明天再说,,,因为我还没有实现出一个Token来,,,,)
今日疑问:
无。
明日任务:
继续做任务四,,,最近有些累,,,课比较多,,,之前写的小博客还想重构一下,,,,慢慢来吧,,,,,
评论