MD5 到底是不是加密?

2021-03-02 碼個蛋

今天想跟大家談談:「MD5 到底是加密的嗎?」

MD5 是程序開發中非常常用的一種算法,很多人都用過。提到 MD5,大多數人的反應都是「這是一種加密算法」,懂得多點的人還會說「可以用於給密碼加密」,再懂點的還知道「MD5 已經有被破解的可能性了」。但 MD5 到底是加密嗎?所謂的加密到底是什麼意思?MD5 的破解又是指的什麼?

MD5:一種哈希算法

實質上,MD5 只是一種哈希算法。

哈希算法,即 hash,又叫散列算法,是一類把任意數據轉換為定長(或限制長度)數據的算法統稱。例如我叫張三,你叫李四,那麼「人 -> 人名」的算法就叫屬於一種哈希算法。哈希算法通常用於製作數字指紋,數字指紋的意思就是「你看到這個東西就像看到原數據一樣」,例如我們在一些網站下載大文件的時候,網站提供給我們驗證文件完整性的 MD5 或者 SHA1 碼,就是原文件的哈希值。哈希算法有很多種,MD5 是其中的一種,這就是 MD5。所以,優秀的哈希算法通常需要具有低碰撞概率(即不同數據的哈希值通常也不一樣)。

加密是什麼?

加密,指的是對數據進行轉換以後,數據變成了另一種格式,並且除了拿到解密方法的人,沒人能把數據轉換回來。因此,加密通常用於網絡通信。因為網絡上的通信數據,任何人都有可能會拿到,把數據加密後再傳送,送達以後由對方解密後再查看,就可以防止網絡上的偷窺。例如大家都知道「安全」但很少人知道「為什麼安全」的 HTTPS,就是通過加密算法來保障的網絡安全性。

所以,MD5 是加密嗎?

加密算法的目的,在於別人無法成功查看加密後的數據,並且在需要的時候還可以對數據進行解密來重新查看數據。而 MD5 算法是一種哈希算法,哈希算法的設計目標本身就決定了,它在大多數時候都是不可逆的,即你經過哈希算法得出的數據,無法再經過任何算法還原回去。所以,既然不能將數據還原,也就不能稱之為可以解密;既然不能解密,那麼哈希的過程自然也就不能稱作是「加密」了。

「不可逆加密」?

你如果試試去查詢百度百科,會發現有一個「MD5 加密」的詞條:

甚至還有一個詞條叫做「不可逆加密算法」:

在「不可逆加密算法」詞條下,MD5 赫然在列。

然而,他們都是錯的。甚至,「不可逆加密算法」這個詞,也是人造的。你甚至可以在網上搜索到一些博客,將加密算法歸類為「可逆加密」和「不可逆加密」兩類。這其實不能怪百度百科,也不能怪這些歸類的人,要怪只能怪,關於數據轉換相關的內容太多、太雜,導致大家用著用著就混淆了。

這些小知識有什麼用?

在開發中,經常會遇到 RSA、AES、BASE64、MD5、SHA1、SHA256、GZIP 這些詞,他們的意義和使用場景都是各不相同的。在剛入行的時候,作為一個底層小碼農,只要按照同事的指示,讓我 BASE64 我就 BASE64,讓我 MD5 我就 MD5,不用問為什麼。但是當你有了一定工作經驗之後,就應該慢慢開始對這些內容有所了解了,不然不僅在開發中會遇到各種障礙,而且在項目出了相關問題的時候,你甚至不知道是你的問題還是同事的問題。做開發,誰都想往高處走,但你在往高處走之前,需要先建立起自己的優勢。

所以如果你只是把這當做一個「小知識」,用「MD5 是不是加密」來跟朋友炫技或者用來在面試時提問求職者,這可能確實沒有什麼用。要知道,有用的不是小知識,而是在你能夠對這些小知識輕鬆回答時,所體現出的完整知識體系。如果把它的本質了解清楚,它到底是什麼、有什麼用、怎麼用,以及它的相關知識都有哪些,它們各自的含義、用法和區別是什麼,這樣的體系化的知識,以及這種不斷把自己的知識向體系化轉換的意識,將會對你非常有用。

想要搭建完整的知識體系,對基礎查漏補缺、更加深入的了解技術本質,從而達到突破瓶頸、提升進階?那就給大家分享一套扔物線朱凱老師的【HenCoder Plus】口碑課程:

現在添加助教微信,備註暗號【領課】

就能免費領取130分鐘試聽課!

相關焦點

  • Python 中 MD5 加密
    # 由於MD5模塊在python3中被移除# 在python3中使用hashlib模塊進行md5操作import hashlib# 待加密信息str = '123456'# 創建md5對象hl = hashlib.md5()#更新hash對象的值,如果不使用update方法也可以直接md5構造函數內填寫
  • 一種基於Md5算法的改進加密方法
    由於md5算法的使用不需要支付任何版權費用的,所以在一般的情況下,md5也不失為一種非常優秀的加密算法,被大量公司和個人廣泛使用。3.改進後的加密方法3.1目前md5加密方法利用的缺陷在目前的信息系統中,對md5加密方法的利用主要通過在腳本頁面中引用包含md5加密函數代碼的文件,以asp腳本為例,在需要調用的頁面中加入
  • C Sharp程式語言如何實現MD5加密的一個實例分享
    一、MD5介紹:MD5在軟體行業是再常見不過的一個詞了,即使你從沒使用過它,也不知道它到底是個什麼東西,但你肯定聽過這個詞MD5的全稱是message-digest algorithm那麼到底什麼是MD5呢?是加密算法嗎?
  • CSharp如何運用MD5算法加密密碼?
    使用MD5必須要先 using System.Security.Cryptography源碼如下:MD5 md5 =newMD5CryptoServiceProvider();//創建MDL5對象byte[] data = System.Text.Encoding.Default.GetBytes(textBox3.Text);//將字符編碼成一個字節序列byte[] md5data = md5.ComputeHash(data);//計算data字節的哈希值
  • 講道理,MD5 到底是不是加密算法?
    二、加密算法百度百科:加密,是以某種特殊的算法改變原有的信息數據,使得未授權的用戶即使獲得了已加密的信息,但因不知解密的方法,仍然無法了解信息的內容。 三、對比也就是說,MD5 算法和加密算法都可以將信息轉換為另外一種內容。
  • 淺談md5弱類型比較和強碰撞
    由於md5不能加密數組,在加密數組的時候會返回NULL所以,我們可以傳入兩個數組可以查找以0e開頭md5加密相等的字符串,也可以自己編寫代碼,提供以下腳本。<?= md5_2,所以我們不能傳入兩個md5加密後以0e開頭的字符串。又因為會將md5加密後的str1和str2中的cxhp替換成0123,也就是說c會被替換成0,所以一個ce開頭的字符串會被替換成0e開頭的字符串。
  • Python 中 MD5 哈希函數的實現
    在本文中,我們將學習Python中的MD5
  • md5到md5破解的一些科普
    看到網上一些對於md5的介紹還有對於當初王小雲所做的破解有很多的誤解,或者說不理解,然後覺得對於這些事情只要說明白還是比較好理解的說。首先md5其實就是一種hash,或者叫散列函數,有的地方叫雜湊函數,都是一個東西啦,其實他就是一種映射,而平常最常見的就是說md5是不可逆的,為什麼不可逆呢,有人就說就是像有些函數沒有反函數那樣了,其實還是有點抽象,考慮md5是多對一的映射,也就是說很多不同的經過md5變換之後可能會是相同的,那麼既然多對一,自然是不可逆啦╮(╯▽╰)╭,你怎麼會知道他到底是由哪個變換過來的呢。
  • CTF中關於md5的一些總結
    _1 = md5($string_1);    $md5_2 = md5($string_2);    if($md5_1 ! hashlibpayload = string.ascii_letters + string.digitsdef calc_md5(s):    md5 = hashlib.md5(s.encode("utf-8")).hexdigest()    md5_double = hashlib.md5(md5.encode("utf-8")).hexdigest
  • php幾種常用的加密解密算法
    php 自帶的加密函數:不可逆的加密函數為:md5()、sha1()、crypt()md5() 用來計算 MD5 哈稀md5(string$str[,bool$raw_output=FALSE] ) :string使用:$str = '123456789
  • [基礎] 幾種好用的PHP自定義加密函數(可逆/不可逆)
    項目中有時我們需要使用PHP將特定的信息進行加密,也就是通過加密算法生成一個加密字符串,這些加密後的字符串可以通過解密算法進行解密,便於程序對解密後的信息進行處理。最常見的應用在用戶登錄以及一些API數據交換的場景。加密解密原理一般都是通過一定的加密解密算法,將密鑰加入到算法中,最終得到加密解密結果。
  • MD5 簡介,及其在 Java 中的實現方式
    值得注意的是,嚴格意義上來講,MD5 以及 SHA1 並不屬於加密算法,也不屬於籤名算法,而是一種摘要算法,用於數據完整性校驗等。了解完基本的 MD5 概念,再來看看 Java 語言中計算 MD5 值的實現方式。
  • 黑馬程式設計師:PHP程式設計師必看—詳解PHP加密
    我們首先來看下 表的內容及其相應的結果: 使用md5()混編字符串 $msg = "This is some message that I just wrote"; $enc_msg = md5($msg); print
  • Java 開發中常用的 4 種加密方法
    來源 | my.oschina.net/u/4139951/blog/3077236一、工具類1. md5加密工具類2.
  • JAVA開發中常用的四種加密方法
    上一篇:這300G的Java資料是我師傅當年給我的,免費分享給大家來源:http://suo.im/4zqd5z作者:愛編程的浪子一、工具類md5加密工具類base64加密工具類Bcrypt工具類二、加密測試MD5加密測試base64加密測試SHA加密測試BCrypt加密測試一、工具類1. md5加密工具類package 加密Tester.util;import java.security.MessageDigest
  • 61【Linux】一步一步學Linux——md5sum命令(61)
    如下文本文件,無論通過哪種模式讀取md5都一致。4.5 將多個文件的md5重定向到指定的文件 [deng@localhost test]$ md5sum * > d.md5 [deng@localhost test]$ cat d.md5
  • 【原創】某PHP加密文件調試解密過程
    實驗樣本http://www.phpjiami.com/據說「加密效果同行最高」?到 http://www.phpjiami.com/phpjiami.html 隨意上傳一個 php 文件,然後下載加密後的文件,這就是我們要解密的文件。
  • 網絡安全加密——DES、AES、RSA、Base64、MD5加密原理介紹,代碼實現
    關於網絡安全的數據加密部分,已是第三篇了,真是不容易呢!:關於DES 3DES加密解密原理不再介紹,現在已經用的不多,如果你的項目還在使用DES加密,還是趕快換吧,換做AES或者更強的非對稱RSA加密。
  • PHP使用AES加密和解密
    AES加密在php5的版本中使用的mcrypt_decrypt 函數,該函數已經在php7.1後棄用了;取而代之的是
  • Java加密與解密:消息摘要算法MD5
    import java.security.MessageDigest;import javax.xml.bind.annotation.adapters.HexBinaryAdapter;public class MDCoder {// MD2加密