Qt之加密算法


 

 
    在寫這篇文章之前,我曾反復思量關於加密的叫法是否准確,更為嚴格來說,應該是密碼散列-將數據(如中英文字母、特殊字符)通過復雜的算法轉換為另一種固定長度的值。
 
QCryptographicHash類
    在Qt中,QCryptographicHash 類提供了生成密碼散列的方法 該類可以用於生成二進制或文本數據的加密散列值。目前支持 MD4、MD5、SHA-1、SHA-224、SHA-256、SHA-384和SHA-512。
  這個類在QtCore4.3中被引入  
 
公共類型
  • enum Algorithm { Md4, Md5, Sha1, Sha224, ..., Sha3_512 }
 
公共方法
  • QCryptographicHash(Algorithm method)
  • ~QCryptographicHash()
  • void addData(const char * data, int length)
  • bool addData(QIODevice * device)
  • void addData(const QByteArray & data)
  • void reset()
  • QByteArray result() const
 
靜態公有成員
  • QByteArray hash(const QByteArray & data, Algorithm method)
 
成員類型文檔
  • enum QCryptographicHash::Algorithm
 常量  取值  描述
 QCryptographicHash::Md4  0  生成一個MD4散列
 QCryptographicHash::Md5   1  生成一個MD5散列 
 QCryptographicHash::Sha1   2  生成一個SHA-1散列  
 QCryptographicHash::Sha224  3  生成一個SHA-224散列(SHA-2)。在Qt5.0介紹
 QCryptographicHash::Sha256  4  生成一個SHA-256散列(SHA-2)。在Qt5.0介紹
 QCryptographicHash::Sha384  5  生成一個SHA-384散列(SHA-2)。在Qt5.0介紹 
 QCryptographicHash::Sha512   6  生成一個SHA-512散列(SHA-2)。在Qt5.0介紹
 QCryptographicHash::Sha3_224  7  生成一個SHA3-224散列。在Qt5.1介紹 
 QCryptographicHash::Sha3_256  8  生成一個SHA3-256散列。在Qt5.1介紹 
 QCryptographicHash::Sha3_384  9  生成一個SHA3-384散列。在Qt5.1介紹 
 QCryptographicHash::Sha3_512  10  生成一個SHA3-512散列。在Qt5.1介紹 
成員函數文檔
  • QCryptographicHash::QCryptographicHash(Algorithm method)
構造一個可以把數據創建為加密哈希值的對象。
  • QCryptographicHash::~QCryptographicHash()
銷毀對象。
  • void QCryptographicHash::addData(const char * data, int length)
將第一長度字符數據的加密哈希。
  • bool QCryptographicHash::addData(QIODevice * device)
從開放的輸入輸出設備讀取數據,直到結束並哈希它。如果成功讀取,則返回true。
QtCore5.0中引入此功能。
  • void QCryptographicHash::addData(const QByteArray & data)
這個函數的重載addData()。
  • QByteArray QCryptographicHash::hash(const QByteArray & data, Algorithm method) [static]
使用此方法返回哈希數據。
  • void QCryptographicHash::reset()
重置對象。
  • QByteArray QCryptographicHash::result() const
返回最后的哈希值。
 
舉例(對文本為“password”的字符串加密):
(1)通過靜態hase()方法計算
    QByteArray byte_array;
    byte_array.append("password");
    QByteArray hash_byte_array = QCryptographicHash::hash(byte_array, QCryptographicHash::Md5);
    QString md5 = hash_byte_array.toHex();
(2)通過result()方法計算
    QByteArray byte_array;
    byte_array.append("password");
    QCryptographicHash hash(QCryptographicHash::Md5);  
    hash.addData(byte_array);  //添加數據到加密哈希值
    QByteArray result_byte_array = hash.result();  //返回最終的哈希值
    QString md5 = result_byte_array.toHex();
    md5結果:5f4dcc3b5aa765d61d8327deb882cf99,可以去找相應的工具進行驗證!
    推薦一個網址: http://www.md5.com.cn/
    效果如下:
Qt之加密算法
    如上所示,無論使用窮舉法還是其他手段來破解,都足以說明沒有絕對的安全。因為理論上通過逐個查找匹配,是可以破解任何一種密文的,問題只在於如何縮短時間而已。

MD5與SHA-1比較
    二者均由MD4導出,所以SHA-1和MD5很相似。他們的強度和其它特性也很相似,但還有以下幾點不同:
(1)對強性攻擊的安全性:最顯著和最重要的區別是SHA-1摘要比MD5要長32位。使用強行技術,產生任何一個 報文使其摘要等於給定報文摘要的難度對MD5為2^128數量級操作,而對SHA-1則是2^160數量級操作。這樣,SHA-1對強攻擊有更大的優勢。
(2)對密碼分析的安全性:由於MD5的設計,易受密碼分析的攻擊,相比之下,SHA-1則不然。
(3)速度:相同硬件上,SHA-1運行速度比MD5慢。
 
     碰撞:由於HASH函數產生定長的密文,結果是有限集合。而待處理的明文可以是計算機網絡傳輸的任何信息。也就是說,明文信息是一個無限集合,密文信息卻有限,兩集合之間無一一對應關系。總有多個不同明文產生相同密文的情況發生,這就是所謂的碰撞。
    MD5與SHA-1曾被認為是足夠安全的HASH算法,早在1994就有報告稱,運算能力最強的機器,平均24天就可能找到一個MD5碰撞。王小雲教授的方法已經為短時間內找到MD5與SHA-1碰撞成為可能。雖然如此,也並不意味着兩種方法就此失效,再者,也可以通過自己的手段來進一步處理。比如:通過MD5與SHA結合實現。將A進行MD5處理得到B,將A在進行SHA處理得到C,再將B與C結合(比如:相加),也可把結合后的結果再進行MD5加密。這足以將碰撞機濾降至很小很小,所以沒有絕對的安全,只有更安全。


免責聲明!

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



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