現如今互聯網時代,安全問題不容小覷,加密技術屢見不鮮,接下來先簡單介紹下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了
到這裏密碼加密就加完了,累累累.
大家記得多多分享,多多寫博客,給別人提供解決思路,也加深對自己的印象.
記得點個贊