日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【OpenSSL】OpenSSL之MD5

發(fā)布時(shí)間:2024/4/24 编程问答 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【OpenSSL】OpenSSL之MD5 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

00. 目錄

文章目錄

    • 00. 目錄
    • 01. MD5簡介
    • 02. 發(fā)展歷史
    • 03. MD5應(yīng)用場景
    • 04. OpenSSL中MD5
    • 05. MD5測試代碼
    • 06. 附錄

01. MD5簡介

MD5信息摘要算法(英語:MD5 Message-Digest Algorithm),一種被廣泛使用的哈希算法,可以產(chǎn)生出一個(gè)128位(16字節(jié))的散列值(hash value),用于確保信息傳輸完整一致。MD5由美國密碼學(xué)家羅納德·李維斯特(Ronald Linn Rivest)設(shè)計(jì),于1992年公開,用以取代MD4算法。這套算法的程序在 RFC 1321 標(biāo)準(zhǔn)中被加以規(guī)范。1996年后該算法被證實(shí)存在弱點(diǎn),可以被加以破解,對于需要高度安全性的數(shù)據(jù),專家一般建議改用其他算法,如SHA-2。2004年,證實(shí)MD5算法無法防止碰撞(collision),因此不適用于安全性認(rèn)證,如SSL公開密鑰認(rèn)證或是數(shù)字簽名等用途。

02. 發(fā)展歷史

1992年8月,羅納德·李維斯特向互聯(lián)網(wǎng)工程任務(wù)組(IETF)提交了一份重要文件,描述了這種算法的原理。由于這種算法的公開性和安全性,在90年代被廣泛使用在各種程序語言中,用以確保資料傳遞無誤等 。

MD5由MD4、MD3、MD2改進(jìn)而來,主要增強(qiáng)算法復(fù)雜度和不可逆性。MD5算法因其普遍、穩(wěn)定、快速的特點(diǎn),仍廣泛應(yīng)用于普通數(shù)據(jù)的加密保護(hù)領(lǐng)域 。

MD2

Rivest在1989年開發(fā)出MD2算法 。在這個(gè)算法中,首先對信息進(jìn)行數(shù)據(jù)補(bǔ)位,使信息的字節(jié)長度是16的倍數(shù)。然后,以一個(gè)16位的校驗(yàn)和追加到信息末尾,并且根據(jù)這個(gè)新產(chǎn)生的信息計(jì)算出散列值。后來,Rogier和Chauvaud發(fā)現(xiàn)如果忽略了校驗(yàn)和MD2將產(chǎn)生沖突。MD2算法加密后結(jié)果是唯一的(即不同信息加密后的結(jié)果不同) 。

MD4

為了加強(qiáng)算法的安全性,Rivest在1990年又開發(fā)出MD4算法 。MD4算法同樣需要填補(bǔ)信息以確保信息的比特位長度減去448后能被512整除(信息比特位長度mod 512 = 448)。然后,一個(gè)以64位二進(jìn)制表示的信息的最初長度被添加進(jìn)來。信息被處理成512位damgard/merkle迭代結(jié)構(gòu)的區(qū)塊,而且每個(gè)區(qū)塊要通過三個(gè)不同步驟的處理。Den boer和Bosselaers以及其他人很快的發(fā)現(xiàn)了攻擊MD4版本中第一步和第三步的漏洞。Dobbertin向大家演示了如何利用一部普通的個(gè)人電腦在幾分鐘內(nèi)找到MD4完整版本中的沖突(這個(gè)沖突實(shí)際上是一種漏洞,它將導(dǎo)致對不同的內(nèi)容進(jìn)行加密卻可能得到相同的加密后結(jié)果)。

MD5

1991年,Rivest開發(fā)出技術(shù)上更為趨近成熟的MD5算法。它在MD4的基礎(chǔ)上增加了"安全帶"(safety-belts)的概念。雖然MD5比MD4復(fù)雜度大一些,但卻更為安全。這個(gè)算法很明顯的由四個(gè)和MD4設(shè)計(jì)有少許不同的步驟組成。在MD5算法中,信息-摘要的大小和填充的必要條件與MD4完全相同。Den boer和Bosselaers曾發(fā)現(xiàn)MD5算法中的假沖突(pseudo-collisions),但除此之外就沒有其他被發(fā)現(xiàn)的加密后結(jié)果了。

03. MD5應(yīng)用場景

3.1 用于密碼管理

當(dāng)我們需要保存某些密碼信息以用于身份確認(rèn)時(shí),如果直接將密碼信息以明碼方式保存在數(shù)據(jù)庫中,不使用任何保密措施,系統(tǒng)管理員就很容易能得到原來的密碼信息,這些信息一旦泄露, 密碼也很容易被破譯。為了增加安全性,有必要對數(shù)據(jù)庫中需要保密的信息進(jìn)行加密,這樣,即使有人得到了整個(gè)數(shù)據(jù)庫,如果沒有解密算法,也不能得到原來的密碼信息。MD5算法可以很好地解決這個(gè)問題,因?yàn)樗梢詫⑷我忾L度的輸入串經(jīng)過計(jì)算得到固定長度的輸出,而且只有在明文相同的情況下,才能等到相同的密文,并且這個(gè)算法是不可逆的,即便得到了加密以后的密文,也不可能通過解密算法反算出明文。這樣就可以把用戶的密碼以MD5值(或類似的其它算法)的方式保存起來,用戶注冊的時(shí)候,系統(tǒng)是把用戶輸入的密碼計(jì)算成 MD5 值,然后再去和系統(tǒng)中保存的 MD5 值進(jìn)行比較,如果密文相同,就可以認(rèn)定密碼是正確的,否則密碼錯(cuò)誤。通過這樣的步驟,系統(tǒng)在并不知道用戶密碼明碼的情況下就可以確定用戶登錄系統(tǒng)的合法性。這樣不但可以避免用戶的密碼被具有系統(tǒng)管理員權(quán)限的用戶知道,而且還在一定程度上增加了密碼被破解的難度。

3.2 電子簽名

MD5 算法還可以作為一種電子簽名的方法來使用,使用 MD5算法就可以為任何文件(不管其大小、格式、數(shù)量)產(chǎn)生一個(gè)獨(dú)一無二的“數(shù)字指紋”,借助這個(gè)“數(shù)字指紋”,通過檢查文件前后 MD5 值是否發(fā)生了改變,就可以知道源文件是否被改動。我們在下載軟件的時(shí)候經(jīng)常會發(fā)現(xiàn),軟件的下載頁面上除了會提供軟件的下載地址以外,還會給出一串長長的字符串。這串字符串其實(shí)就是該軟件的MD5 值,它的作用就在于下載該軟件后,對下載得到的文件用專門的軟件(如 Windows MD5 check 等)做一次 MD5 校驗(yàn),以確保我們獲得的文件與該站點(diǎn)提供的文件為同一文件。利用 MD5 算法來進(jìn)行文件校驗(yàn)的方案被大量應(yīng)用到軟件下載站、論壇數(shù)據(jù)庫、系統(tǒng)文件安全等方面 。

3.3 垃圾郵件篩選

在電子郵件使用越來越普遍的情況下,可以利用 MD5 算法在郵件接收服務(wù)器上進(jìn)行垃圾郵件的篩選,以減少此類郵件的干擾,具體思路如下:

  • 建立一個(gè)郵件 MD5 值資料庫,分別儲存郵件的 MD5 值、允許出現(xiàn)的次數(shù)(假定為 3)和出現(xiàn)次數(shù)(初值為零)。
  • 對每一封收到的郵件,將它的正文部分進(jìn)行MD5 計(jì)算,得到 MD5 值,將這個(gè)值在資料庫中進(jìn)行搜索。
  • 如未發(fā)現(xiàn)相同的 MD5 值,說明此郵件是第一次收到,將此 MD5 值存入資料庫,并將出現(xiàn)次數(shù)置為1,轉(zhuǎn)到第五步。
  • 如發(fā)現(xiàn)相同的 MD5 值,說明收到過同樣內(nèi)容的郵件,將出現(xiàn)次數(shù)加 1,并與允許出現(xiàn)次數(shù)相比較,如小于允許出現(xiàn)次數(shù),就轉(zhuǎn)到第五步。否則中止接收該郵件。結(jié)束。
  • 接收該郵件。
  • 04. OpenSSL中MD5

    OpenSSL中的MD5函數(shù)分析

    md5.h內(nèi)容如下:

    /** Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved.** Licensed under the OpenSSL license (the "License"). You may not use* this file except in compliance with the License. You can obtain a copy* in the file LICENSE in the source distribution or at* https://www.openssl.org/source/license.html*/#ifndef HEADER_MD5_H # define HEADER_MD5_H# include <openssl/opensslconf.h># ifndef OPENSSL_NO_MD5 # include <openssl/e_os2.h> # include <stddef.h> # ifdef __cplusplus extern "C" { # endif/** !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!* ! MD5_LONG has to be at least 32 bits wide. !* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!*/ # define MD5_LONG unsigned int# define MD5_CBLOCK 64 # define MD5_LBLOCK (MD5_CBLOCK/4) # define MD5_DIGEST_LENGTH 16typedef struct MD5state_st {MD5_LONG A, B, C, D;MD5_LONG Nl, Nh;MD5_LONG data[MD5_LBLOCK];unsigned int num; } MD5_CTX;int MD5_Init(MD5_CTX *c); int MD5_Update(MD5_CTX *c, const void *data, size_t len); int MD5_Final(unsigned char *md, MD5_CTX *c); unsigned char *MD5(const unsigned char *d, size_t n, unsigned char *md); void MD5_Transform(MD5_CTX *c, const unsigned char *b); # ifdef __cplusplus } # endif # endif#endif

    相關(guān)函數(shù)分析

    // 初始化 MD5 Contex, 成功返回1,失敗返回0 int MD5_Init(MD5_CTX *c); // 循環(huán)調(diào)用此函數(shù),可以將不同的數(shù)據(jù)加在一起計(jì)算MD5,成功返回1,失敗返回0 int MD5_Update(MD5_CTX *c, const void *data, size_t len); // 輸出MD5結(jié)果數(shù)據(jù),成功返回1,失敗返回0 int MD5_Final(unsigned char *md, MD5_CTX *c); // MD5_Init,MD5_Update,MD5_Final三個(gè)函數(shù)的組合,直接計(jì)算出MD5的值 unsigned char *MD5(const unsigned char *d, size_t n, unsigned char *md); // 內(nèi)部函數(shù),不需要調(diào)用 void MD5_Transform(MD5_CTX *c, const unsigned char *b);

    05. MD5測試代碼

    MD5測試參考代碼

    #define _CRT_SECURE_NO_WARNINGS #include <iostream>#include <openssl/md5.h>using namespace std;int main() {int ret = -1;int i = 0;unsigned char md[MD5_DIGEST_LENGTH];unsigned char buf[MD5_DIGEST_LENGTH * 2 + 1];MD5_CTX c;const void *data = "程序改變世界";//1. 初始化ret = MD5_Init(&c);if (1 != ret){printf("MD5_Init failed...\n");return 1;}//2. 添加數(shù)據(jù)ret = MD5_Update(&c, (const void *)data, strlen((char *)data));if (1 != ret){printf("MD5_Update failed...\n");return 1;}//3. 計(jì)算結(jié)果ret = MD5_Final(md, &c);if (1 != ret){printf("MD5_Final failed...\n");return 1;}//4. 輸出結(jié)果cout << "md: " << md << endl;memset(buf, 0, MD5_DIGEST_LENGTH * 2 + 1);for (i = 0; i < MD5_DIGEST_LENGTH; i++){sprintf((char*)&buf[i * 2], "%02X", md[i]);}cout << buf << endl;cout << "==============================" << endl;memset(md, 0, MD5_DIGEST_LENGTH);MD5((unsigned char *)data, strlen((char*)data), md);memset(buf, 0, MD5_DIGEST_LENGTH * 2 + 1);for (i = 0; i < MD5_DIGEST_LENGTH; i++){sprintf((char*)&buf[i * 2], "%02X", md[i]);}cout << buf << endl;cout << "hello itcast" << endl;system("pause");return 0; }

    測試結(jié)果

    06. 附錄

  • 參考:百度百科

  • 維基百科:Crypto++

  • 維基百科 MD5

  • 官方網(wǎng)站: https://www.openssl.org/

  • 總結(jié)

    以上是生活随笔為你收集整理的【OpenSSL】OpenSSL之MD5的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。