常見的密碼加密措施


常見的密碼加密措施
#

MD5

  全稱是Message-Digest Algorithm 5(信息-摘要算法5),理論上是一種單向的哈希散列,

特性:

  • 輸入任意長度的信息,經過處理,輸出為128位的大整數(數字指紋)(32位16進制數);
  • 不同的輸入一般得到不同的結果(唯一性);
  • 根據128位的輸出結果不可能反推出輸入的信息(不可逆);
  • 強抗碰撞:想找到兩個不同的數據,使它們具有相同的MD5值,是非常困難的。

MD5用途:

1、防止被篡改:
  1)比如發送一個電子文檔,發送前,我先得到MD5的輸出結果a。然后在對方收到電子文檔后,對方也得到一個MD5的輸出結果b。如果a與b一樣就代表中途未被篡改。
  2)比如我提供文件下載,為了防止不法分子在安裝程序中添加木馬,我可以在網站上公布由安裝文件得到的MD5輸出結果。
  3)SVN在檢測文件是否在CheckOut后被修改過,也是用到了MD5.

2、防止直接看到明文:
  現在很多網站在數據庫存儲用戶的密碼的時候都是存儲用戶密碼的MD5值。這樣就算不法分子得到數據庫的用戶密碼的MD5值,也無法知道用戶的密碼(其實這樣是不安全的,后面我會提到)。(比如在UNIX系統中用戶的密碼就是以MD5(或其它類似的算法)經加密后存儲在文件系統中。當用戶登錄的時候,系統把用戶輸入的密碼計算成MD5值,然后再去和保存在文件系統中的MD5值進行比較,進而確定輸入的密碼是否正確。通過這樣的步驟,系統在並不知道用戶密碼的明碼的情況下就可以確定用戶登錄系統的合法性。這不但可以避免用戶的密碼被具有系統管理員權限的用戶知道,而且還在一定程度上增加了密碼被破解的難度。)

3、防止抵賴(數字簽名):
  這需要一個第三方認證機構。例如A寫了一個文件,認證機構對此文件用MD5算法產生摘要信息並做好記錄。若以后A說這文件不是他寫的,權威機構只需對此文件重新產生摘要信息,然后跟記錄在冊的摘要信息進行比對,相同的話,就證明是A寫的了。這就是所謂的“數字簽名”。

MD5算法過程:

  對MD5算法簡要的敘述可以為:MD5以512位分組來處理輸入的信息,且每一分組又被划分為16個32位子分組,算法的輸出由四個32位分組組成,將這四個32位分組級聯后將生成一個128位散列值。基本操作,求余、取余、調整長度、與鏈接變量進行循環運算。
第一步、填充:如果輸入信息的長度(bit)對512求余的結果不等於448,就需要填充使得對512求余的結果等於448。填充的方法是填充一個1和n個0。填充完后,信息的長度就為N*512+448(bit);

第二步、記錄信息長度:用64位來存儲填充前信息長度。這64位加在第一步結果的后面,這樣信息長度就變為N512+448+64=(N+1)512位。

** 第三步、裝入標准的幻數(四個整數):**標准的幻數(物理順序)是(A=(01234567)16,B=(89ABCDEF)16,C=(FEDCBA98)16,D=(76543210)16)。如果在程序中定義應該是(A=0X67452301L,B=0XEFCDAB89L,C=0X98BADCFEL,D=0X10325476L)。

第四步、四輪循環運算:循環的次數是分組的個數(N+1)

MD5安全性:

  普遍認為MD5是很安全,因為暴力破解的時間是一般人無法接受的。實際上如果把用戶的密碼MD5處理后再存儲到數據庫,是很不安全的。因為用戶的密碼是比較短的,而且很多用戶的密碼都使用生日,手機號碼,身份證號碼,電話號碼等等。或者使用常用的一些吉利的數字,或者某個英文單詞。如果我把常用的密碼先MD5處理,把數據存儲起來,然后再跟你的MD5結果匹配,這時我就有可能得到明文。比如某個MD5破解網站http://www.cmd5.com/default.aspx ,把其網站下的公告復制如下:
  md5破解、動網論壇密碼破解等不再需要用窮舉法,本站共有md5記錄235億條,還在不斷增長中,已包含10位及10位以下數字、7位字母、部分7位字母+數字,全部6位及以下字母加數字等組合,並針對國內用戶做了大量優化,例如已經包含所有手機號碼、全國部分大中城市固定電話號碼、百家姓、常用拼音等大量組合,另加入了某大型網站真實會員密碼數據10萬條。本站數據量大,查詢速度快,同時支持16位及32位密碼查詢。通過對10萬會員的真實動網論壇樣本數據的測試,本站對於動網論壇密碼的命中率達到83%。

如何保證安全性

下面按照措施將密碼安全等級划分為5層:

Level0:明文也就是不加密

username	password
tom	123456

Level1:摘要式身份驗證

驗證流程:

  1. 提交用戶名密碼
  2. 計算密碼哈希值
  3. 比對存儲的哈希值和計算出的哈希值是否相等

相同:登陸成功
不同:登陸失敗
使用哈希算法(可以是md5, sha1, sha256,sha512 結果長度依次增長):

123456→SHA-512→ba3253876aed6b

username	password
tom	ba3253876aed6b…

**哈希算法缺點: **
1.容易遭受彩虹表(rainbow table, 如下)攻擊!通過把大量的哈希值和原密碼存儲的組合存儲在表中。達到用得到的hash值反向查詢原密碼。

hash_value	original_password
ba3253876aed6b…	123456
c70b5dd9ebfb6f…	abc123
b109f3bbbc244e…	password
…	…

2.另外一個缺點是可以看到誰有相同的密碼

username	password
tom	ba3253876aed6b…
jerry	ba3253876aed6b…
…	…

Level2: 哈希+salt

學名叫加鹽(salt),salt可以簡單的理解成:隨機產生的一定長度的,可以和密碼相結合,從而使hash算法產生不同結果的字符串。

123456 + 0x23f22(salt)→SHA-512→bc22711a45e73e5e50f8...

username	salt	password
tom	0x23f22	bc22711a45e73e5e50f8…

優點:這種方法會極大防止受到彩虹表的攻擊,因為即便攻擊者構造出彩虹表,因為你使用了 hash(密碼+ salt),攻擊者彩虹表里的哈希值(hash(密碼))和你數據庫中的哈希值是不同的。
缺點: 如果攻擊者知道了salt和你的哈希值,就可以計算出你的原始密碼(當然也沒有那么容易)

增強版本:
兩次MD5,使用一個隨機字符串salt與密碼的md5值再進行一次md5,使用很廣泛
由於現在的彩虹表大部分是針對一次md5的,當然可能存在多次md5的彩虹表,那么我們可以多次md5,大大增加他的存儲成本和少量的計算成本

Level3: 增加計算的時間 (哈希 + salt + Iteration)

通過迭代計算的方式增加計算密碼的成本。迭代的周期控制在用戶可以接受范圍內,這樣攻擊者的計算和時間成本就會大大增加。

123456 + 0x23f22(salt)→SHA-512 (500000 times)→bc6567567a45e73...

username	iteration	salt	password
tom	500000	0x23f22	bc6567567a45e73…

類似的方法可以使用: BCript(比正常的hash+salt慢10000倍,因此增加了10000倍的破解成本)

hashed value = BCript(password,salt,cost factor)

123456 + 0x23f22(salt) + 10 (cost factor)→BCript→bc6567567a45e73...

username	password
tom	$2a$10$rocuFOLJQLDDM12XMDJ32

注:

  1. 一般的應用做到LEVEL3就可以了,如果需要更加安全的方式請看下文。
  2. 增加迭代次數會增加自己的系統的運行成本,比如說:原來用MD5時一台服務器解決用戶登錄問題負載剛好100%,你用這個該死的bcrypt算法就需要該死的上萬台服務器才能解決問題。

Level4: 加密哈希后的密碼 Encrypt(BCript的結果或者密碼+salt經過hash的結果)

密鑰(Encryption key) + BCript的結果→AES 256→ox2c78a32f...

username	password
tom	ox2c78a32f…
  • 定時更換密鑰(准備一組密鑰定時更換,首先通過密鑰解密加密存儲的密碼得到 bscript計算出的hash值,在用新的密鑰進行加密)
  • 密鑰存儲在在不同的數據源
    (通過將密鑰存儲在不同的數據源的方法,進一步增加了破解難度,因為需要同時獲得用戶密碼表數據,同時要獲得其他數據源存儲的密鑰)

Level5: 在Level4的基礎上,將密碼分成若干個塊,分發到不同的數據庫

補充

1.設計自己的哈希函數。不要簡單地復制粘貼常見開源代碼。這樣會增加安全性,別人就算獲得了你的加密源碼,也要重新構造彩虹表。
2.SHA-1,安全哈希算法,對於長度小於2^64位的消息,SHA1會產生一個160位的消息摘要。。該算法的思想是接收一段明文,然后以一種不可逆的方式將它轉換成一段(通常更小)密文。加密性強的散列一定是不可逆的,這就意味着通過散列結果,無法推出任何部分的原始信息。任何輸入信息的變化,哪怕僅一位,都將導致散列結果的明顯變化,這稱之為雪崩效應,雪崩效應是我們所希望的。相比MD5,推導過程比較相似,因為二者均由MD4導出,但是比md5長摘要長32 位,更安全,但依然可以用彩虹表破解。
3.SHA-224、SHA-256、SHA-384,和SHA-512並稱為SHA-2,它們生成的摘要密文分別就是224,256,384,512位。雖然SHA-2比SHA-1具有更高的安全性,但是SHA-2應用並不廣泛,原因是在某些操作系統上缺乏支持。
4.MD5+salt對於大部分中小網站來說已經足夠安全了;
5.不能加固定鹽(salt)(不是隨機salt,全部設一樣的值),人家連你的密碼庫都能拿到,鹽還不是輕而易舉的事情么?還有說不知道我的算法是什么,老大,人家能攻破你的系統登進來,把你的整套數據庫拿走,還差程序不成?告訴你,剩下的問題只是你的庫里面有多少價值而已。比如這樣的思路:
我已經有你的程序了;
找到生成密碼散列值的入口函數Fuck();
拿一個明文密碼庫,在一個用戶賬號上面不停地改密碼,也就是用每一個P不斷地Fuck(P);
好了,密碼碰撞庫就出來了。

一些調用方法:

MD5

import java.math.BigInteger;
import java.security.MessageDigest;
/*
MD5(Message Digest algorithm 5,信息摘要算法) 
通常我們不直接使用上述MD5加密。通常將MD5產生的字節數組交給BASE64再加密一把,得到相應的字符串
Digest:匯編
*/
public class MD5 {
public static final String KEY_MD5 = "MD5";   

public static  String  getResult(String inputStr)
{
    System.out.println("=======加密前的數據:"+inputStr);
    BigInteger bigInteger=null;

    try {
     MessageDigest md = MessageDigest.getInstance(KEY_MD5);   
     byte[] inputData = inputStr.getBytes(); 
     md.update(inputData);   
     bigInteger = new BigInteger(md.digest());   
    } catch (Exception e) {e.printStackTrace();}
    System.out.println("MD5加密后:" + bigInteger.toString(16));   
    return bigInteger.toString(16);//返回此 BigInteger 的給定基數16進制的字符串表示形式。
}

public static void main(String args[])
{
    try {
         String inputStr = "簡單加密8888888888888888888";   
         getResult(inputStr);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

}

SHA

import java.math.BigInteger;
import java.security.MessageDigest;

/*
SHA(Secure Hash Algorithm,安全散列算法),數字簽名等密碼學應用中重要的工具,
被廣泛地應用於電子商務等信息安全領域。雖然,SHA與MD5通過碰撞法都被破解了, 
但是SHA仍然是公認的安全加密算法,較之MD5更為安全*/
public class SHA {
 public static final String KEY_SHA = "SHA";   

public static  String  getResult(String inputStr)
{
    BigInteger sha =null;
    System.out.println("=======加密前的數據:"+inputStr);
    byte[] inputData = inputStr.getBytes();   
    try {
         MessageDigest messageDigest = MessageDigest.getInstance(KEY_SHA);  
         messageDigest.update(inputData);
         sha = new BigInteger(messageDigest.digest());   
         System.out.println("SHA加密后:" + sha.toString(32));   
    } catch (Exception e) {e.printStackTrace();}
    return sha.toString(32);
}

public static void main(String args[])
{
    try {
         String inputStr = "簡單加密";   
         getResult(inputStr);
    } catch (Exception e) {
        e.printStackTrace();
    }

}

}

一種常見的對稱加密算法--DES

  目前在國內,隨着三金工程尤其是金卡工程的啟動,DES算法在POS、ATM、磁卡及智能卡(IC卡)、加油站、高速公路收費站等領域被廣泛應用,以此來實現關鍵數據的保密,如信用卡持卡人的PIN的加密傳輸,IC卡與POS間的雙向認證、金融交易數據包的MAC校驗等,均用到DES算法。
  DES算法的入口參數有三個:Key、Data、Mode。其中Key為8個字節共64位,是DES算法的工作密鑰;Data也為8個字節64位,是要被加密或被解密的數據;Mode為DES的工作方式,有兩種:加密或解密。
 DES算法是這樣工作的:如Mode為加密,則用Key 去把數據Data進行加密, 生成Data的密碼形式(64位)作為DES的輸出結果;如Mode為解密,則用Key去把密碼形式的數據Data解密,還原為Data的明碼形式(64位)作為DES的輸出結果。在通信網絡的兩端,雙方約定一致的Key,在通信的源點用Key對核心數據進行DES加密,然后以密碼形式在公共通信網(如電話網)中傳輸到通信網絡的終點,數據到達目的地后,用同樣的Key對密碼數據進行解密,便再現了明碼形式的核心數據。這樣,便保證了核心數據(如PIN、MAC等)在公共通信網中傳輸的安全性和可靠性。
  通過定期在通信網絡的源端和目的端同時改用新的Key,便能更進一步提高數據的保密性,這正是現在金融交易網絡的流行做法。
 DES算法具有極高安全性,到目前為止,除了用窮舉搜索法對DES算法進行攻擊外,還沒有發現更有效的辦法。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM