你的密码安全吗? 怎么做才能相对安全?14年网路安全事故频发,大规模DNS劫持,然后又爆出了openSSL的Heartbleed(心脏滴血)漏洞,在这个不安全的网络世界你的密码真的安全吗?
密码是怎么被安全地储存到数据库中,如何才能确保在数据库层面上用户密码的安全,如何保证数据库数据被其他人获取仍能保证用户密码不被破译保证用户密码的相对安全。这是个大问题。
首先声明,我经验不足,所写到地也只是冰山一角
不管是何种语言,何种框架,在web领域一定会抽象出两个对象,Request和Response(请求和响应)这是由HTTP协议造成了,一个web站点也可以说是一台web服务器如果你给它一个请求,那么它一定会给你一个响应,说的更加直白更加贴近你的生活一点就是你在地址栏里敲一个地址,比如这就是你像一台web服务器发送了一个请求,HTTP协议遵循着“有求必应”的原则其实是只要有一个请求那么一定要产生一个响应,那么站在我们java面向对象(不只是java所有面向对象语言)封装特性的角度来看待这个问题我们需要封装一个Request对象和一个Response对象来传递由客户端提交的数据和返回给客户端的数据,接下来我需要说明一般的登录过程,然后模拟后台的处理过程写出相应的逻辑代码来处理登录这件事
1.我们访问QQ空间这个网址(上面我已经说过其实我们是访问了一台web服务器对吧)它相应给我们的页面是你最熟悉的QQ空间登录页面,让我们输入QQ号和密码然后下面一个大大的登录按钮点击这个按钮之后发生了什么事情你是不知道的,那么下面我就叙述一下,它把你输入的账号和密码提交到那台服务器上然后执行了一系列的业务逻辑如果你输入的QQ号和密码相匹配就会登录成功,否则登录失败,流程图就是下面这个样子
既然是登录那就是有这个用户对吧,现在什么都没有,那就先来个添加用户的逻辑首先是数据库表的设计,这张表就叫Admin吧,字段就给几个简单的吧使用了JPA
package com.finereader.model;
import javax.persistence.Entity;
import javax.persistence.Table;
import java.io.Serializable;
/**
* Created with Intellij IDEA.
* <p>Created by rainchen
* User: rainchen
* Date: 15-1-20
* Time: 下午6:15.
*/
@Entity
@Table(name = “admin”)
public class Admin implements Serializable{
@Id
private String id;
private String name;
private String password;
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return “Admin{” +
“id='” + id + ”’ +
“, name='” + name + ”’ +
“, password='” + password + ”’ +
‘}’;
}
}
处理的逻辑我就不写了,比较麻烦,DAO层Service层也没什么好写的,看下Service层吧
package com.finereader.service;
import com.finereader.dao.AdminDao;
import com.finereader.model.Admin;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.io.Serializable;
/**
* Created with Intellij IDEA.
* <p>Created by rainchen
* User: rainchen
* Date: 15-1-20
* Time: 下午6:23.
*/
@Service
public class AdminService {
@Autowired
private AdminDao adminDao;
public Serializable add(Admin admin){
return adminDao.save(admin);
}
}
前台看起来是这个样子的,主要功能就是提交数据嘛,丑点就丑点吧…
这时我还没有添加加密代码,如果这时候添加用户时密码时没有被加密的
数据库里密码不加密是不行的,所以了我写了个Encrypt的加密类提供一个静态的方法
package com.finereader.util;
import org.springframework.stereotype.Service;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
/**
* Created with Intellij IDEA.
* <p>Created by rainchen
* User: rainchen
* Date: 15-1-20
* Time: 下午6:54.
*/
@Service
public class Encrypt {
public static String encode(String str) {
if (str == null)
return null;
StringBuilder sb = new StringBuilder();
try {
MessageDigest code = MessageDigest.getInstance(“MD5”);
code.update(str.getBytes());
byte[] bs = code.digest();
for (int i = 0; i < bs.length; i++) {
int v = bs[i] & 0xFF;
if (v < 16)
sb.append(0);
sb.append(Integer.toHexString(v));
}
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
}
return sb.toString().toUpperCase();
}
}
所以我要修改下上面的AdminService在返回之前添加
admin.setPassword(Encrypt.encode(admin.getPassword()))
来看看效果:
嗯。效果不错不错,朕甚是满意,但是这样真的安全了吗?我来讨论一下:
1.上面的加密方法真的不好,只是把加密后的密文中的小写字母变成大写
2.把每个字节变成16进制
3.这样会造成什么问题呢,我们再添加一个用户试试
你不知道这一串加密的密文是由什么加密来的,可是我知道呀
都是问题,需要引入什么样的概念才能修改这些不足呢,这些其实我感觉非常有意思
一次看来是写不完了,下次接着写吧,处理完这些有意思的事情…