在寫這篇文章之前,我曾反復思量關於加密的叫法是否准確,更為嚴格來說,應該是密碼散列-將數據(如中英文字母、特殊字符)通過復雜的算法轉換為另一種固定長度的值。
公共方法
QByteArray byte_array;
byte_array.append("password");
QByteArray hash_byte_array = QCryptographicHash::hash(byte_array, QCryptographicHash::Md5);
QString md5 = hash_byte_array.toHex();
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,可以去找相應的工具進行驗證!
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()方法計算
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/。
效果如下:
如上所示,無論使用窮舉法還是其他手段來破解,都足以說明沒有絕對的安全。因為理論上通過逐個查找匹配,是可以破解任何一種密文的,問題只在於如何縮短時間而已。
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則不然。
(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加密。這足以將碰撞機濾降至很小很小,所以沒有絕對的安全,只有更安全。