常规性加密:sha1+MD5+salt

现如今互联网时代,安全问题不容小觑,加密技术屡见不鲜,接下来先简单介绍下sha1和MD5加密;


  • MD5 的全称是Message-Digest Algorithm 5(信息-摘要算法),在90年代初由MIT Laboratory for Computer Science和RSA Data Security Inc的Ronald L. Rivest开发出来,经MD2、MD3和MD4发展而来。
    作用:把一个任意长度的字节串变换成一定长的大整数

  • SHA安全哈希算法(Secure Hash Algorithm)主要适用于数字签名标准(Digital Signature Standard DSS)里面定义的数字签名算法(Digital Signature Algorithm DSA)。SHA-1是一种数据加密算法,该算法的思想是接收一段明文,然后以一种不可逆的方式将它转换成一段(通常更小)密文,也可以简单的理解为取一串输入码(称为预映射或信息),并把它们转化为长度较短、位数固定的输出序列即散列值(也称为信息摘要或信息认证代码)的过程。
    作用: 对于长度小于2^64位的消息,SHA1会产生一个160位的消息摘要。

从查表法可以看出,即便是将原始密码加密后的哈希值存储在数据库中依然是不够安全的。那么有什么好的办法来解决这个问题呢?答案是加盐。

  • Salt是什么?就是一个随机生成的字符串。我们将盐与原始密码连接(concat)在一起(放在前面或后面都可以),然后将concat后的字符串加密。采用这种方式加密密码,查表法就不灵了(因为盐是随机生成的)。

下面以一个简单的小demo为例,实现sha1&MD5&salt为用户密码加密


现在假设有用户类/表 User
属性有:

  • String userName; //用户名
  • String pwd; //密码
  • String Salt; //盐
  • 等……

第一步,进行sha1加密

首先,sha1是在前端(jsp,h5,app等)进行加密.
加密步骤,项目中引入sha1.js文件

文件下载连接http://download.csdn.net/download/qq_35860097/10154750

js中有 function hex_sha1(s){…} 方法

 //点击按钮注册
$('#register').click(function () {
    //获取页面参数
    var userName= $('#userName').val();
    var pwd = $('#pwd').val();
    //进行密码sha1加密
    pwd = hex_sha1(pwd);
    //ajax提交注册信息到后台......
 })

第二步,加盐(后台操作)

在后台写一个加盐方法(最好封装成工具类)
加盐步骤很简单,不用引入jar包,就是随机生成字母

//获取随机字母
//num表示生成多少位的随机字符;
public static String getSalt(int num) {
    String salt = "";
    for (int i=0;i<num;i++){
           char c='a';
           c=(char)(c+(int)(Math.random()*26));
           salt +=c;
    }
    return salt;

}

在Controller/Action/servlet…..中的操作

//获取到前端传过来的信息
//初始化用户信息
User user = new User();
user.setUserName(userName);
user.setPwd(pwd);
//加盐获取6位数的随机字符串
user.setSalt(getSalt(6));
//将md5加密后的密码,重新塞入密码字段
user.setPassword(Get_MD5(user.getPassword()+user.getSalt()));
//加密方法>>>第3步
//将用户信息添加到数据库...............

第三步,MD5加密(后台操作)

//需要MessageDigest工具类
import java.security.MessageDigest;

public String Get_MD5(String str){
        String word=null;
        try {
            MessageDigest md5=MessageDigest.getInstance("MD5");
            md5.update(str.getBytes());
            byte[] data=md5.digest();
            StringBuffer sb=new StringBuffer(data.length*2);
            for(byte b:data){
                if ((b & 0xFF) < 0x10) sb.append("0");
                sb.append(Integer.toHexString(b & 0xFF));
            }
            word=sb.toString();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            word=null;
        }
        return word;
    }

加密流程

前段利用sha1加密密码字段 —–> 后台编写,随机生成字符串的方法(生成盐) —–> 将密码和盐追加成一个字符串,然后讲这个字符串进行MD5加密, —–> MD5加密后返回新的密码,将这个密码重新设置到密码字段.将用户信息添加到数据库;

用户登录判断
前段利用sha1加密密码字段 —–> 根据userName从数据库取出密码/盐字段 —–> 将从前段获取的密码+盐字段进行MD5加密 —–> 然后在判断MD5加密后的密码是否和数据库中密码一致.就OK了


到这里密码加密就加完了,累累累.
大家记得多多分享,多多写博客,给别人提供解决思路,也加深对自己的印象.
记得点个赞

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章