前言
SSL是讓人頭大的東 西,看起來很復雜,我學過信息安全課,但是對SSL仍然是模糊一片。對於數字證書也是一知半解,從來沒有去認真研究過。只知道 個大概,“反正就是對稱加密和非對稱加密”,詳細的就不懂了。其實這些跟操作系統,計算機體系結構一樣,是基礎知識,即使你不是專門研究信息安全的,即使 你平時用不到,這些東西也應該是必須了解的~ It’s not rocket science!
我這篇文章首先介紹有關信息安全的一些基本概念。然後分析數字證書的構成,用途以及SSL的工作原理。Enjoy!
第一章 為什麼網絡是不安全的?
計算機世界是基於網絡的,根據目前網絡的結構和實現,數據包在世界各地的路由器之間游蕩,任何人都可以獲得你的發送的數據包,從而獲得你發送的數據。局域網內就更方便了,只要你開個Sniffer在那裡監聽,別人QQ聊天的信息一覽無余啊~為什呢?我來簡單解釋一下計算機網絡是如何傳輸數據的。
現實生活中,如果你請快遞幫你寄東西,一般情況下,快遞會把東西送到目的地,而不是其他地方。路由器就像是快遞,在Internet上負責送數據。但和真 實的快遞不同的是,路由器會把你要發送的信息廣播給離目的地更近的路由器,可能是一個路由器,也可能是多個路由器(別問我為啥,我不想深入了,有興趣自己 查資料)。這樣你的信息就變成多份的了。復制虛擬的信息不值錢那~現實生活中的快遞可不能復制你要寄的東西。一般情況下,只有一份數據會被目的計算機接收 到,其他的拷貝在網絡上游蕩一段時間以後就被拋棄了。但是,這給黑客們有了很多可乘之機。他們在網絡上監聽很多垃圾信息,過濾掉沒用的,留下他們感興趣 的,然後就可以偷窺別人隱私了。
正是因為網絡有這樣的問題,人們就發明了很多加密通信的手段,來保證自己的通信的內容不會被洩露。SSL和數字證書就是用來干這個的。
第二章 信息安全的基本概念
在解釋SSL和數字證書之前,我覺得有必要解釋一下幾個有關信息安全的基本概念。
第一節 安全的定義
如果說兩個人之間的通信是安全的,那麼如何定義這個安全呢?
1. 保密性(Confidentiality)
保密性應該很容易理解,就是只有你自己和你允許的人能看到相關的信息。這和物理文件的保密性是一樣的。
2. 完整性(Integrity)
所謂完整性就是你的信息沒有被破壞或者篡改過。舉個例子比如網絡聊天,保證對方收到的信息就是你發出的信息也是信息安全的一部分。
3. 可獲得性(Availability)
可獲得性是指你自己在需要的時候能夠訪問到信息或者保證對方能夠收到你的信息。
通常,我們平時說的“安全”往往只包括第一點,保密性。其實後面兩點也是很重要的,特別是在信息安全領域。如果沒有完整性和可獲得性,光保密又有什麼用呢?回到我們的主題,SSL和數字證書主要關注的是前兩點。至於可獲得性就需要涉及到硬件,管理等等了。
第二節 認證與授權
現在的問題是,我們如何保證上面所定義的“安全”?通常,有以下兩個方法:
1. 認證(Authenti
cation)
認證是證明你就是那個你所聲稱的那個人。舉個例子,你說你是張三,然後去機場登機,機場工作人員怎麼知道你就是張三呢?你必須出示你的身份證或者護照,這 樣就可以證明你就是那個你所聲稱的張三。在信息安全領域也一樣,比如你想去google查看zhlmmc的郵件,然後google會問你要zhlmmc的 密碼,因為只有zhlmmc知道zhlmmc帳戶的密碼,如果你能說出那個密碼,那麼你就是zhlmmc,google就會把zhlmmc的郵件返回給 你。有些文章把這個過程稱為Identification。
2. 授權(Authorization)
授權是指一個系統裡面有很多用戶,有些用戶能做某些事情,有些用戶不能做某些事情。比如
Linux,很多用戶可以同時通過認證而登錄到Linux主機,但是只有root才能修改或刪除系統文件,普通用戶只能修改自己的home。
這裡每一點都可能涉及很多不同的技術來保證過程的順利進行。“授權”跟業務邏輯的牽扯比較大,SSL和數字證書更多的關注第一點。
第三章 加密與算法
加密是保護信息安全的常用手段之一。對信息的加密是需要加密算法的,如果加密算法被破解了,那麼一切免談。不過,基本上,要破解一個加密算法是非常非常困難的。至少,目前流行的加密算法還是安全的,所以我們也就不必考慮這個問題了。
第一節 散列(Hash)
經常用bt下載的人應該很熟悉這個。這就是MD5啊~雖然Hash不只是MD5,常見的還有SHA1。不過MD5最流行所以一般大家說的hash就是它了。值得一提的是,山東大學的王小雲在2005年的時候發了一篇“ How to Break MD5 and Other Hash Functions”引起了信息安全界的轟動。雖然我沒仔細研讀過這篇paper,不過我相信按照paper裡面的說法要破解MD5還是很費勁的,要不早就出亂子了。所以我們就不考慮這個問題了。那麼究竟什麼是MD5呢?我來簡單解釋一下。
Hash就是一個工具,能把任意大小的文檔變成一個 固定大小(MD5是32個字符)的字符串。並且,這個過程是 不可逆的,也就是說,沒有任何辦法從那個字符串得到原來那個文檔。還有很重要的一點是, 任意兩個文檔(哪怕極其相似)得到相同字符串的概率幾乎等於0。現在你 有一個10000字的文章,發給你的朋友,那你的朋友怎麼判斷他收到的文章一個標點符號都沒有少呢?你在發送文章的同時把這個文章的Hash字符串也發過 去,這樣你的朋友收到文章以後,根據收到的文章重新計算一遍這個字符串,如果這個字符串和你發過去的一樣,那就證明你朋友收到的文章是和你發送的一模一 樣。
第二節 對稱加密(Symmetric Cryptography)
所謂加密就是把一段能看懂的東西通過某種變換變成看不懂的東西。當然這種變換是可逆的,否則加密有什麼用啊!這裡所說的“變換”就是加密算法。目前我們所 說的加密算法基本上都是基於密鑰的。加密算法不能單獨工作,必須有密鑰配合。就像現實生活中的鎖,同一型號的鎖的原理都一樣,但是每把鎖都有各自的鑰匙, 用來開鎖和關鎖。 加密的算法是公開的,但密鑰是保密的。自己“發明”加密算法是很愚蠢 的,除非你是密碼學專家。歷史上有很多使用自己發明的加密算法的笑話,往往你發明的算法都是自以為是,其實很容易破解的拉。而目前流行的加密算法都是經過 時間和眾人檢驗的,一般情況下,只要密鑰不洩露,那就是安全的。有一點要說明的是,雖然我們平時一般說“加密算法”,但往往這個加密算法都包含解密算法 的。 “對稱加密”是指加密和解密的密鑰是同一個。目前流行的對稱加密算法 有DES,AES,Blowfish等等。舉個例子,你有一篇文章想要發給你朋友,但是你不想讓別人看見這篇文章所以你選擇AES加密。用的密鑰是你和你 朋友事先約定的,只有你們兩個人知道。在發送之前,你用AES算法和約定好的密鑰給文章加密,然後把加密過的文章發送給你的朋友。你朋友收到以後可以用 AES算法和那個密鑰解密而獲得原始的那篇文章。 對稱加密算法的優點是速度快,缺點是密鑰管理不方便,要求共享密鑰。
第三節 非對稱加密(Asymmetric Cryptography)
如果你理解了上面講的對稱加密,那麼這裡的非對稱加密就很簡單了。從字面上理解就可以猜到, 加密和解密不是用的同一個密鑰,其中一個稱為公鑰(public key),另一個稱為私鑰(private key)。公鑰就是公開的,大家都知道,而私鑰只有你自己知道。這兩個密鑰在數學上是有聯系的,用公鑰加密的內容只能由相應的私鑰來解密,反過來,用私鑰 加密的內容只能由相應的公鑰來解密。另外很重要的一點是, 不能從公鑰推導出私鑰,或者說很困難。常用的非對稱加密算法有 RSA,ECC等等。舉個例子,你想要把一篇文章發送給你的朋友,但是不想讓別人看到這篇文章。除了用上面講的方法以外,你還可以用非對稱加密來實現。在 發送之前,你把文章用你朋友的公鑰加密(公鑰是公開的,每個人都知道),然後把加密過後的文章發送給你的朋友,你的朋友可以用他的私鑰來解密。其他人獲得 了你傳送的內容都是沒有用的,因為只有你朋友有私鑰可以解密。 非對稱加密算法的優點是密鑰管理很方便,缺點是速度慢。
第四節 數字簽名(Digital Signature)
我們先來看看現實生活中的簽名是如何實現的。比如為信用卡賬單簽名,商家會打印一張消費單子給你,你看過以後覺得沒有問題,於是在這張紙上簽上自己的大 名,表示你承認了這筆消費,並同意商家從你的信用卡賬戶扣錢。而商家可以對比你的簽名和信用卡背後的簽名是否一致來驗證你是否冒用別人的信用卡(事實上很 多商家不看的哦)。這個流程是基於一個假設的: 只有你自己能重現你的簽名。雖然我們不能每次都簽的一摸一樣,但是通過筆跡鑒定,我們可以確定這個簽名是否出自你手。分析一下,簽名具有哪些特點呢?
1. 不可偽造 - 通過筆記鑒定來保證。
2. 不可移植,復制 - 復印,剪貼的簽名當然無效咯!
3. 不可否認 – 因為不可偽造,不可移植,不可復制,所以不可否認。
相似的,在虛擬世界裡,我們有數字簽名來幫助證明某個文檔是你創建的,或者是你認可的。 數字簽名所用的技術是散列和非對稱加密。數字簽名的假設是: 只有你自己有你的私鑰。根據前面對散列的介紹,我們先為你要簽名的信息 生成一個Hash字串,Hash1,然後用你的私鑰加密得到Encrypted(Hash1),這就是你對這個文檔的數字簽名。當別人需要驗證某個文檔是 否是你簽名的時候,只需要用你的公鑰解密你的簽名得到Hash1,並和該文檔計算出來的Hash2對比,查看是否一致。如果一致則說明你確實對該文檔簽過 名,否則就是沒有。下面來分析一下,數字簽名是如何保證上面所講的簽名的特點的。
1. 不可偽造
因為只有你有你自己的私鑰,所以任何其他人都無法產生用你的私鑰加密過的Hash1。
2. 不可移植,復制
你對文檔A的簽名不可能對文檔B也有效,因為你對文檔B的簽名必然和對A的簽名不一樣,這是由Hash的唯一性保證的。拿你對A的簽名去驗證B是不可能通過的。
3. 不可否認
因為不可偽造,不可移植,不可復制,所以不可否認。
仔細想想數字簽名和現實生活中的簽名真的蠻像的,邏輯上是一樣的。或許你在想,為什麼要對Hash加密呢?我直接對文檔用我的私鑰加密不就完了嘛?對啊,效果是一樣的,但是效率不一樣哦~別忘了非對稱算法是很慢的,加密一個100M的文件要算半天呢!
這裡要順便提一下消息認證碼( Message Authentication Code)。 它和數字簽名很相似,只不過它是用對稱加密的而數字簽名用的是非對稱加密。
在現實生活中,各種加密手段往往是配合使用以達到最好的效果和效率。比如我將要介紹的SSL和數字證書,就是混合了各種的加密手段。
第四章 數字證書
上面講了這麼多都是前戲,現在該到主題了。前面提到的認證(Authentication)的時候說,現實生活中可以用身份證和護照來證明身份, 那麼在虛擬世界裡,數字證書就是身份證。和現實生活不同的是,並不是每 個上網的用戶都有數字證書的,往往只有當一個人需要證明自己的身份的時候才需要用到數字證書。那麼什麼時候需要證明自己的身份呢?普通用戶一般是不需要 的,網站並不關心是誰訪問了網站,現在的網站只關心流量啊~反過來,網站就需要證明自己的身份了。比如你想要提交信用卡信息給預定航班的網站,那麼你如何 確定你正在訪問的網站就是你所想要訪問的那個呢?現在 釣魚網站很 多的。比如你想訪問的是“www.ctrip.com”,但其實你訪問的是“www.otrip.com”,所以在提交自己的信息之前你需要驗證一下網站 的身份,要求網站出示數字證書。一般正常的網站都會主動出示自己的數字證書。由於證書在網頁浏覽中最為常見,所以我下面舉的例子都是基於浏覽器的。
第一節 數字證書的構成
我們的身份證是由公安機關頒發的,並加有很多防偽技術,不能偽造(或者說很難)。同樣的,數字證書也有專門的發證機關(Certificate Authority,簡稱CA,其實是一些商業公司啦)。比較常見的發證機關是 VeriSign。數字證書的發證機關會對自己發放的證書加上自己的數字簽名,以保證證書不能被偽造。那數字證書到底包含了些什麼呢?
1. 持有者姓名(Common Name)
2. 發證機關(Issuer)
3. 有效日期(Validity)
4. 證書持有人的公鑰(Subject’s Public Key Info)
5. 擴展信息 (Extension)
6. 用發證機關對該證書的數字簽名(Certificate Signature)
基本信息就這些了(這些信息會在後面的章節有所解釋),為了更清晰的說明問題,來幾張截圖:
圖1:數字證書的基本內容
圖2:數字證書的結構
圖3:數字證書詳細內容
這幾張截圖都是我從Firefox裡面拷貝出來的,這張證書已經過期了,不過不影響理解。從圖2我們可以看到,Certificate(證書)和 Signature(簽名)是分開的,但其實這個Signature也是證書的一部分。可以這麼理解,數字證書包含證書主體和數字簽名。證書中的簽名是對 證書主體的簽名。
第二節 如何驗證數字證書?
好了,現在我們有了虛擬世界的身份證了,那如何使用呢?和現實生活中檢查身份證一樣,包含三個步驟:
1. 檢查身份證防偽標記
數字證書的防偽標記就是發證機關的私鑰加密的那段內容。如何驗證?首先我們是默認擁有發證機關的公鑰的。如果是浏覽器的話,常見的發證機關的公鑰是內置的。如下圖所示:
圖4:Firefox內置的發證機關的數字證書
雖然Firefox內置的是數字證書,但是有數字證書就有公鑰,所以是一樣的。當浏覽器拿到一個數字證書,先看發證機關,然後找到相應的發證機關的 證書,獲得發證機關的公鑰,用此公鑰解密被加密的MD5,這樣就獲得了此證書的MD5值,我們稱它為Hash1。然後浏覽器用MD5算法對此證書重新計算 一遍MD5,獲得Hash2。然後比較Hash1和Hash2是否相等。如果相等就證明這張證書是由發證機關頒發的,並且沒有被篡改過。回過頭去看看上面 講Hash和MD5的部分,你應該能想明白為什麼的。
2. 核對相貌
在現實生活中,你的身份證只有一張,你應該好好保管不被別人拿到。但難免錢包丟了,身份證跟著遭殃。所以我們在驗證完身份證的真假之後我們要驗證持證的 人,和身份證上所聲明的那個人是不是同一個,我們往往通過比較相貌來辨別。那在虛擬世界又是怎樣的呢?你應該已經發現,任何人都可以擁有你的證書就像我們 裝的Firefox就有很多發證機關的證書。所以核對持有證書人的身份就很重要了。這就要依賴證書裡面包含的公鑰了。此公鑰是這張證書所有者的公鑰(注 意,我這裡指的是所有者,而不是持有者!),我們用此公鑰加密一段信息發送給證書的持有者,如果持有者能發送回(可以是被私鑰加密,也可以是明文,沒有關 系)被加密的這段信息的話就證明該持有者擁有該證書對應的私鑰,也就是說,該持有者就是該證書的所有者。
3. 核對姓名
最後一步,也是最重要的一步。看清楚了,站在你面前的人的名字和登記在冊的名字一樣。舉個例子,我拿著護照去機場登機,護照和人都沒有問題,問題是我根本 沒有買機票。如果機場工作人員只核對了前面兩步的話,我就可以登機了,豈不是很荒謬?同樣的,在虛擬世界,比如那個“ctrip”的例子,你拿到了一個證 書,並且驗證沒有問題,但是證書上的Common Name明明寫的是“otrip”,你還繼續嗎?
如果這三個步驟都沒有問題,你就可以確信正在和你通信的對方是可以信任的,是你想要聯系的那個人。
第三節 數字證書的級聯(Certificate Chain)
根據上述討論,我們可以知道,所有數字證書都是基於另外一張默認為可信任(浏覽器內置)的數字證書的。也就是說,我們必須用一張已知合法的數字證書去驗證 另外一張未知的數字證書。第二節提到的發證機關的數字證書就是默認為可信任的。事實上,發證機關的證書是自己簽發給自己的,驗證沒有意義。因為這些證書是 人工配置在我們電腦上的,所以默認為安全的。這些證書稱為“根證書”。
由於申請證書的人數眾多,發證機關忙不過來,需要一些代理來幫忙簽發證書,有可能代理也需要代理來幫忙。這樣就產生了證書的層級關系,如下圖所示:
圖5:級聯的數字證書
這裡的“www.paypal.com”是由二級代理“VeriSign Class 3 Extended Validation SSL SGC CA”簽發的,而二級代理的證書又是由一級代理“VeriSign Class 3 Public Primary Certification Authority – G5”簽發的,而一級代理的證書是由根證書機關“Buildin Object Token: Verisign Class 3 Public Primary Certification Authority”簽發的。不必太關注這裡的名字,名字而已,重要的是他們各自的位置。在驗證這張證書的時候需要從下往上遞歸驗證。先驗證用戶證書(最 下面的證書,這裡就是“www.paypal.com”),如果這樣證書在浏覽器的可信任列表裡面那麼驗證到此結束,如果不是的話就要檢查證書的防偽標 記,這需要用到二級代理的證書,同樣的,如果二級代理的證書在可信任列表裡面,那麼直接使用,否則就要檢查二級代理證書的防偽標記,這需要用到一級代理的 證書……直到根證書為止,如果根證書不在可信任列表裡面,那麼這張證書就沒法驗證了。這個過程的簡單流程圖是這樣的:
圖6:級聯證書的驗證流程
需要注意的是,這是一個遞歸過程,所以這裡的返回只是返回到上層遞歸。對於我們這個例子中的級聯證書的驗證可能是這樣的:
圖7:級聯證書驗證流程示例
這個過程看起來沒有什麼問題。但是仔細一想,發現有一個大問題。任何一個擁有合法證書的人都可以給別人簽發證書了,不就是在這個繼承關系上面多加一層嗎? 黃粱大夢!事情沒那麼簡單啦~能夠簽發證書的叫CA,不管是否是代理,它都是CA,只有CA的證書才能擁有下級,那如何判斷一張證書是否是CA呢?還記得 我們在第一節講過的證書中包含的擴展信息嗎?這裡可以放很多東西,包括這張證書的合法用途,如下圖所示:
圖8:證書的擴展信息
這裡我們很清楚的可以看到用戶證書是不能作為CA來用的,白紙黑字寫著“Is not a Certificate Authority”。而CA的證書也有不同的權限。“Maximum number of intermediate CAs”說明了這個CA的權限大小。如果這個數字是0(比如這裡的二級代理的證書),說明這個CA只能簽發用戶證書,而不能再授權其他機構為CA。如果這 個數字是1,說明這個CA可以再授權一層代理,以此類推。圖中沒有顯示根證書的Extension,因為根證書沒有Extension,沒有表示沒有限 制。在驗證級聯證書的時候,浏覽器會檢查證書的Extension,如果某個證書超范圍使用了,浏覽器會發出警告的。級聯證書為證書的簽發帶來了很大的方 便和靈活性。事實上我們可以看到,任何一張用戶證書都應該是級聯的,至少擁有一個上級證書(根證書)。所以在我們前面的例子中的 “ebiz.isir.cmu.edu”這張證書是很奇怪的,不是標准的證書。這張證書是無法驗證的,只在學校內部網上使用,默認接收就行了(浏覽器會把 它當成根證書來處理)。
關於數字證書,我還有幾點想要提一下:
1. 數字證書本身不加密,加密的是數字證書的hash。數字證書加密了就很麻煩了,如何獲知發證機關呢?不知道發證機關就不知道解密的公鑰啊!還有,明文的數字證書可以顯示數字證書的信息,即使不能驗證數字證書的真偽,但是給了人為判斷一個機會。
2. 數字證書中的公鑰可以是自己指定的,也可以是發證機關生成的。不同的發證機關可能有不同的要求。
3. 申請證書的過程是安全的。如果申請證書的過程都不安全的話,後面的一切都免談了。現實生活中,申請數字證書往往要求郵寄,或者電話,傳真,甚至當面申請的。
第五章 SSL的基本原理
現在回到我們最原始的問題,由於Internet的架構問題,信息在網絡上傳輸是很容易被別人獲取的,那如何建立一個安全的傳輸網絡呢?前面我們討論了很多保證信息安全的技術,而SSL就是建立在這些技術的基礎上的一套協議,用來保證通信的安全。SSL全稱是 Secure Sockets Layer,它是一種間於傳輸層(比如TCP/IP)和應用層(比如HTTP)的協議。具體的SSL協議很復雜,我這裡只講一個大概。
最簡單的方法來保證通信安全是用非對稱加密。我們前面講過數字證書的認證,如果雙方都認證了對方的數字證書,那麼每次傳輸信息的時候都用對方的公鑰加密,這樣就只有對方能解密,從而保證了信息的安全。但是對於日常應用(比如網頁浏覽)有兩個問題:
1. 非對稱加密速度緩慢,消耗資源
如果客戶端和服務器之間傳輸文件用非對稱加密的話,速度一定慢的忍無可忍。
2. 不可能要求每個用戶都去申請數字證書
申請數字證書是一個相當麻煩的過程,要求每個上網的用戶都擁有證書是不可能的事情。
SSL通過“握手協議”和“傳輸協議”來解決上述問題。握手協議是基於非對稱加密的,而傳輸協議是基於對稱加密的。根據不同的應用,SSL對證書的要求也 是不一樣的,可以是單方認證(比如HTTP, FTP),也可以是雙方認證(比如網上銀行)。通常情況下,服務器端的證書是一定要具備的,客戶端的證書不是必須的。下面兩張圖片顯示了SSL握手的過程。
圖9:SSL握手,單方服務器認證
圖10:SSL握手,雙方認證
握手協議可以看成是客戶端和服務器協商的一個過程,結果就是一個對稱密鑰,然後就進入了傳輸協議的部分。也許,你在想,“現在還不簡單嗎?用這個對 稱密鑰加密傳輸數據呗!”。否,沒那麼簡單。先來看一下結果,等會兒再解釋原因。在通信雙方協商出一個對稱密鑰以後,他們用這個密鑰來加密傳輸的數據。同 時為每個消息生成時間戳,用此密鑰為消息和相應的時間戳生成消息認證碼(MAC)。也就是說,每次發送的內容包括
Encrypt(message) + MAC(message + timestamp)
這麼做有幾個好處:
1. 防止消息的篡改
所謂消息篡改就是有第三者插在通信雙方之間,篡改往來的消息。由於消息是加密的,第三者不能獲得消息的內容,但是他可以閉著眼睛瞎改。如果沒有MAC的話,接受者就無法判斷此消息是否被篡改過。
2. 防止消息重放
消息的重放是只第三者記錄下通信雙方的每一次發送的消息,雖然他不能獲得消息的內容。但是它可以通過重新發送客戶端或者服務端的信息來把自己裝成是客戶端或者服務端。如果在MAC裡面加上了時間戳,消息接收方驗證時間戳就可以阻止消息的重放攻擊。
SSL的基本思想是用非對稱加密來建立鏈接(握手階段),用對稱加密來傳輸數據(傳輸階段)。這樣既保證了密鑰分發的安全,也保證了通信的效率。
通過上面對SSL的分析,我們可以看到,SSL並不能阻止別人獲得你傳輸的數據,但是由於你傳輸的數據都是加密過的,別人拿到了毫無用處,一樣可以保護信 息的安全。還有一點需要強調一下,SSL並不依賴於TCP,它可以建立在任何可靠的傳輸層協議(比如TCP)之上。也就是說SSL是不能建立在UDP之上 的。這是顯然的,如果傳輸都不可靠,偶爾丟兩個包或者包的順序換一換的話,怎麼保證安全呢?
結束語
信息安全這東西平時看起來挺懸,大家都知道重要,但是很少有人真的在乎。我相信90%的網民是不考慮信息安全這件事的,或者說有的根本不知道。通常情況 下,浏覽器報告什麼證書不合法,用戶都是直接點OK跳過。而作為搞計算機的專業人員,你可以不在乎,但你不能不明白。這篇文章不是什麼信息安全的教程,只 是我自己學習的一個總結,怕以後忘記了,還有東西讓我翻翻回憶一下,方便自己也造福他人。