區塊鏈學習之密碼學安全技術(五)

Hash 算法與數字摘要


Hash (哈希或散列)算法它能將任意長度的二進制明文串映射為較短的(通常是固定長度的)二進制串(Hash值),并且不同的明文很難映射為相同的Hash值。

Hash 定義

Hash (哈希或散列): 能將任意長度的二進制明文串映射為較短的(通常是固定長度的)二進制串(Hash值),并且不同的明文很難映射為相同的 Hash 值。
Hash 值在應用中又常被稱為指紋或摘要(digest)。Hash 算法的核心思想也經常被應用到基于內容的編址或命名算法中

一個優秀的Hash算法將能實現如下功能:

  • 正想快速: 給定明文和 Hash 算法,在有限時間和有限資源內能計算得到Hash值
  • 逆向困難: 給定(若干)Hash值,在有限時間內很難(基本不可能)逆推出明文
  • 輸入敏感: 原始輸入信息發生任何改變,新產生的 Hash 值都應該出現很大不同
  • 沖突避免: 很難找到兩端內容不同的明文,使得它們的 Hash 值一致(發生碰撞)、

沖突避免:有時候又稱為“抗碰撞性”,分為:

  • 弱抗碰撞性: 如果給定明文前提下,無法找到與之碰撞的其他明文,則算法具有“弱碰撞性”
  • 強抗碰撞性: 如果無法找到任意兩個發生 Hash 碰撞的明文,則算法具有“強抗碰撞性”

常見算法

目前常見的 Hash 算法包括 MD5 和 SHA系列算法,MD5算法和SHA1已經被破解,一般推薦使用SHA2-256或更安全的算法

性能

Hash算法分為:

  • 計算敏感型(一般都是): 意味著計算資源是瓶頸,主頻越高的 CPU 運行Hash 算法的速度也越快。因此可以通過硬件加速來提升Hash計算的吞吐量。
  • 非計算敏感型: 例如 scrypt 算法,計算過程需要大量的內存資源,節點不能通過簡單地增加更多的 CPU 來獲得 Hash 性能的提升。這樣的Hash算法經常用于在 避免算力攻擊的場景

數字摘要

數字摘要:對數字內容進行Hash運算,獲取唯一的摘要值來指代原始完整的數字內容。數字摘要是 Hash算法最重要的一個用途。利用Hash函數的抗碰撞性特點,數字摘要可以解決確保內容未被篡改過的問題。

Hash攻擊與防護

Hash 算法并不是一種加密算法,不能用于對信息的保護。但Hash算法常用于對口令的保存上。例如用戶登錄網站,網站后臺保存口令的Hash值,每次登錄進行比對即可,即便數據庫泄露,也無法從 Hash值還原口令,只能進行窮舉。

Hash攻擊: 由于有時用戶設置口令的強度不夠,只是一些常見的簡單字符串,如password,123456等。有人專門搜集了這些常見口令,計算對應的Hash值,制作成字典。這樣通過Hash值可以快速反查到原始口令。這一類以空間換時間的攻擊方法包括字典攻擊彩虹表攻擊(只保存一條Hash鏈的首尾值,相對字典攻擊可以節省存儲空間)等。

Hash攻擊防范方法:為了防范這一類攻擊,一般采用加鹽(salt)的方法。保存的不是口令明文的 Hash值,而是口令明文再加上一段隨機字符串(即“鹽”)之后的Hash值。Hash結果和“鹽”分別存放在不同的地方,這樣只要不是兩者同時泄露,攻擊者就很難破解了。

加解密算法


加解密算法是密碼學的核心技術,可分為兩大基本類型:


image.png

加解密系統基本組成

現代加解密系統的典型組件一般包括: 加解密算法、加密密鑰、解密密鑰。其中,加解密算法自身是固定不變的,并且一般是公開可見的。密鑰則是關鍵的信息,需要安全地保存起來,甚至通過特殊硬件進行保護。對同一種算法,密鑰需要按照特定算法每次加密前隨機生成,長度越長,則加密強度越大。加解密基本過程如下:

image.png

根據加解密過程中使用的密鑰是否相同,算法可以分為對稱加密非對稱加密,兩種模式適用于不同的需求,恰好形成互補,某些時候可以組合使用,形成混合加密機制。

密碼學實現的安全往往是通過算法所依賴的數學問題來提供,而并非通過對算法的實現過程進行保密。

對稱加密算法

對稱加密算法,加密和解密過程的密鑰是相同的。

  • 優點:加解密效率(速度快,空間占用小)和加密強度都很高。
  • 缺點:參與方都需要提前持有密鑰,一旦有人泄露則安全性被破壞,另外如何在不安全通道中提前分發密鑰也是個問題,需要借助Diffie-Hellman協議或非對稱加密方式來實現。

對稱密碼從實現原理上可以分為兩種:

  • 分組密碼: 將明文切分為定長數據塊作為基本加密單位,應用最為廣泛。分組對稱加密代表算法包括 DES、3DES、AES、IDEA等
  • 序列密碼: 每次只對一個字節或字符進行加密處理,且密碼不斷變化,只用在一些特定領域,如:數字媒介的加密等。序列密碼,又稱流密碼,每次通過偽隨機數生成器來生成偽隨機密鑰串。

對稱加密算法適用于大量數據的加解密過程;不能用于簽名場景;并且往往需要提前分發好密鑰;

非對稱加密算法

非對稱加密可以很好的解決對稱加密中提前分發密鑰的問題。非對稱加密中,私鑰一般需要通過隨機數算法生成,公鑰可以根據私鑰生成。公鑰一般公開,他人可獲取的;私鑰一般是個人持有,他人不能獲取

非對稱加密算法:

  • 優點: 是公私鑰分開,不安全通道也可使用。
  • 缺點:是處理速度(特別是生成密鑰和解密過程)往往比較慢,一般比對稱加解密算法慢2~3個數量級;同時加密強度也往往不如對稱加密算法。

非對稱加密算法的安全性往往需要基于數學問題來保障,目前主要有基于大數質因子分解、離散對數、橢圓曲線等經典數學難題進行保護。代表算法包括: RSA、ElGamal、橢圓曲線(ECC)、SM2等系列算法。目前普遍認為RSA類算法可能在不遠的將來被破解,一般推薦可采用安全強度更高的橢圓曲線系列算法。

選擇明文攻擊

在非對稱加密中,由于公鑰是公開可以獲取的,因此任何人都可以給定明文,獲取對應的密文,這就帶來選擇明文攻擊的風險。 在已知明文攻擊、已知密文攻擊、選擇明文攻擊中,最有威脅的為選擇明文攻擊。

  • 已知明文攻擊: 得到了一些給定的明文和對應的密文
  • 已知密文攻擊: 只知道密文,只能通過統計特性分析其中有什么規律了
  • 選擇明文攻擊:通過公鑰加密一些常用語,截取發送方的密文和公鑰加密后的密文對比獲取信息。

為了規避選擇明文攻擊這種風險,現有的非對稱加密算法都引入了一定的保護機制。對同樣的明文使用同樣密鑰進行多次加密,得到的結果完全不同,這就避免了選擇明文攻擊的破壞。實現上有多種思路:

  • 對明文先進行變形,添加隨機的字符串或標記,再對添加后結果進行處理。
  • 先用隨機生成的臨時密鑰對明文進行對稱加密,然后再對對稱密鑰進行加密,即混合利用多種加密機制。

混合加密機制

混合加密機制同時結合了對稱加密和非對稱加密的優點。先用計算復雜度高的非對稱加密協商出一個臨時的對稱加密密鑰(也稱為會話密鑰)然后雙方通過對稱加密算法傳遞的大量數據進行快速的加解密處理。

HTTPS 在傳統的HTTP層和TCP層之間通過引入 Transport Layer Security/Secure Socket Layer(TLS/SSL)加密層來實現可靠的傳輸
HTTPS 為典型應用案例:

image.png

該過程的主要功能:在防止中間人竊聽和篡改的前提下完成會話密鑰的協商。

離散對數與Diffie-Hellman 密鑰交換協議

Diffie-Hellman(DH)密鑰交換協議是一個經典協議,使用該協議可以在不安全信道完成對稱密鑰的協商,以便后續通信采用對稱加密。

DH的缺點:

  • 阻塞性攻擊:沒有提供雙方身份的任何信息. 它是計算密集性的,因此容易遭受阻塞性攻擊,即對手請求大量的密鑰.受攻擊者花費了相對多的計算資源來求解無用的冪系數而不是在做真正的工作.
  • 容易遭受中間人的攻擊

消息認證與數字簽名


消息認證碼和數字簽名技術通過對消息的摘要進行加密,可用于消息放篡改和身份證明問題。

消息認證碼

消息認證碼: 全稱是“基于Hash的消息認證碼”。消息認證碼基于對稱加密,可以用于對消息完整性進行保護。

基本過程: 對某個消息利用提前共享的對稱密鑰和Hash算法進行加密處理,得到HMAC值。該HMAC值持有方可以證明自己擁有共享的對稱密鑰,并且也可以利用HMAC確保消息內容未被篡改。

消息認證碼一般用于證明身份的場景, 主要問題是需要共享密鑰

數字簽名

數字簽名基于非對稱加密,既可以用于證實某數字內容的完整性,又同時可以確認來源。

典型的場景: A通過信道發給B一個文件(一份信息),B如何獲知收到的文件即為A發出的原始版本?A可以先對文件內容進行摘要,然后用自己的私鑰對摘要進行加密(簽名),之后同時將文件和簽名發給B。B收到文件和簽名后,用A的公鑰來解密簽名,得到數字摘要,與收到文件進行摘要后的結果進行比對。如果一致,說明該文件確實是A發的(別人無法擁有A的私鑰),并且文件內容沒有被修改過(摘要結果一致)

知名的數字簽名算法包括DSA 和 安全強度更高的ECSDA等。
除普通的數字簽名應用場景外,針對一些特定的安全需求,產生了一些特殊數字簽名技術:

  • 盲簽名: 簽名者需要在無法看到原始內容的前提下對信息進行簽名。盲簽名可以實現對所簽名內容的保護,防止簽名者看到原始內容。另一方面,盲簽名還可以實現防止追蹤,簽名者無法將簽名內容和簽名結果進行對應。
  • 多重簽名:即n個簽名者中,收集到至少m個(n>=m>=1)的簽名,即認為合法。其中,n是提供的公鑰高數,m是需要匹配公鑰的最少的簽名個數
  • 群簽名:即某個群組內一個成員可以代表群組進行匿名簽名。簽名可以驗證來自于該群組,卻無法準確追蹤到簽名的是哪個成員
  • 環簽名: 環簽名是一種簡化的群簽名。簽名者首先選定一個臨時的簽名者集合,集合中包括簽名者自身。然后簽名者利用自己的私鑰和簽名集合中其他人的公鑰就可以獨立地產生簽名,而無需他人的幫助。簽名者集合中的其他成員可能并不知道自己被包含在最終的簽名中 。環簽名在保護匿名性方面有很多的用途。

安全性

數字簽名算法自身的安全性由數學問題進行保障,但在使用上,系統的安全性也十分關鍵。目前常見的數字簽名算法往往需要選取合適的隨機數作為配置參數,配置參數不合理的使用或泄露都會造成安全漏洞,需要進行安全保護。

數字證書


對于非對稱加密算法和數字簽名來說,很重要的一點就是公鑰的分發。但在傳輸過程中,公鑰有沒有可能是偽造的呢?傳輸過程中有沒有可能被篡改?一旦公鑰出了問題,則整個建立在其上的安全體系的安全性將不復存在。

數字證書機制: 可以證明所記錄信息的合法性,比如證明某個公鑰是某個實體(如組織或個人)的,并且確保一旦內容被篡改能被探測出來,從而實現對用戶公鑰的安全分發。

根據保護公鑰的用途,可以分為:

  • 加密數字證書:用于保護用于加密信息的公鑰
  • 簽名驗證數字證書:用于保護用于進行解密簽名進行身份驗證的公鑰
    一般情況下,證書需要由證書認證機構來進行簽發和背書

證書規范

一般來說,一個數字證書內容可能包括基本數據(版本、序列號)、所簽名對象信息(簽名算法類型、簽發者信息、有效期、被簽發人、簽發的公開密鑰)、CA的數字簽名,等等。目前使用最廣泛的標準為ITU和ISO聯合制定的X.509的 v3 版本規范
證書的頒發者還需要對證書內容利用自己的私鑰添加簽名,以防止別人對證書內容進行篡改。

證書格式

X.509規范中一般推薦使用PEM格式來存儲證書相關的文件。證書文件的文件名后綴一般為.crt或.cer,對應私鑰文件的文件名后綴一般為.key,證書請求文件的文件名后綴為.csr。有的時候也統一用.pem作為文件名后綴。此外還有DER格式,是采用二進制對證書進行保存,可以與PEM格式互相轉換。

證書信任鏈

證書中記錄了大量信息,其中最重要的包括“簽發的公開密鑰”和“CA數字簽名”兩個信息。因此,只要使用CA的公鑰再次對著個證書進行簽名比對,就能證明某個實體的公鑰是否是合法的。

那么怎么證明用來驗證對實體證書進行簽名的CA公鑰自身是否合法呢?

  • 可以通過上層的CA頒發的證書來進行認證
  • 某些根CA可以通過預先分發證書來實現信任基礎
    證書作為公鑰信任的基礎,對其生命周期進行安全管理十分關鍵。

PKI 體系


在非對稱加密中,公鑰可以通過證書機制來進行保護,但證書的生成、分發、撤銷等過程并沒有在X.509規范中進行定義。安全地管理和分發證書可以遵循PKI(Public Key Infrastructure)體系來完成。PKI體系核心解決的是證書生命周期相關的認證和管理問題。PKI是建立在公私鑰基礎上實現安全可靠傳遞消息和身份確認的一個通用框架,并不代表某個特定的密碼學技術和流程。

PKI 基本組件

PKI至少包括如下核心組件:

  • CA(Certification Authority): 負責證書的頒發和作廢,接收來自RA的請求,是最核心的部分。(主要完成對證書信息的維護)
  • RA(Registration Authority): 對用戶身份進行驗證,校驗數據合法性,負責登記,審核過了就發給CA
  • 證書數據庫: 存放證書,多采用X.500系列標準格式。可以配合LDAP目錄服務管理用戶信息

操作流程: 用戶通過RA登記申請證書,提供身份和認證信息等;CA審核后完成證書的制造,頒發給用戶。用戶如果需要撤銷證書則需要再次向CA發出申請。

證書的簽發

CA對用戶簽發證書實際上是對某個用戶公鑰,使用CA的私鑰對其進行簽名。這樣任何人都可以用CA的公鑰對該證書進行合法性驗證。驗證成功則認可該證書中所提供的用戶公鑰內容,實現用戶公鑰的安全分發。

用戶證書的簽發可以有兩種方式:

  • 由CA直接來生成證書(內含公鑰)和對應的私鑰發給用戶
  • 由用戶自己生成公鑰和私鑰,然后由CA來對公鑰內容進行簽名(這種方式整個過程中,用戶可以保持私鑰信息的私密性,不會被其他方獲知包括CA方)

證書的撤銷

證書超過有效期后會作廢,用戶也可以主動向CA申請撤銷某證書文件。

CA 無法強制收回已經頒發出去的數字證書,因此為了實現證書的作廢,往往還需要維護一個撤銷證書列表,用于記錄已經撤銷的證書序號。(所以第三方驗證某個證書時,第一步就是檢查該證書是否在撤銷列表中,如果存在則無法驗證通過。如果不在則繼續后續驗證)

Merkle 樹結構


Merkle(默克爾)樹:又叫哈希樹,是一種典型的二叉樹結構,由一個根節點、一組中間節點和一組葉節點組成。區塊鏈出現之前,廣泛用于文件系統和P2P系統中。

image.png

主要特點:

  • 最下面的葉節點包含存儲數據或其哈希值
  • 非葉子幾點(包括中間節點和根節點)都是它的兩個孩子節點內容的哈希值
    默克爾樹逐層記錄哈希值的特點,讓它具有了一些獨特的性質。例如,底層數據的任何變動,都會傳遞到其父節點,一層層沿著路徑一直到樹根。這意味著樹根的值實際上代表了對底層所有數據的“數字摘要”

默克爾樹的應用場景有如下:

  • 快速比較大量數據:對每組數據排序后構建默克爾樹結構。當兩個默克爾樹根相同時,則意味著兩組數據必然相同。否則,必然存在不同。(由于Hash計算的過程可以十分迅速,預處理可以在短時間內完成。利用默克爾樹結構能帶來巨大的比較性能優勢)
  • 快速定位修改: 一旦發現某個節點如Root的數值發生變化,沿著Root->N4->N1,即可快速定位到實際發生改變的數據塊D1
  • 零知識證明: 如何向他人證明擁有某組數據(D0...D3)中包括給定某個內容D0而不暴露其他任何內容。方法:通過構造如上圖所示的一個默克爾樹,公布N1、N5、Root。D0擁有者通過驗證生成的Root是否跟提供的值一致,即可很容易檢測D0包括D1、D2、D3的存在。整個過程無法獲知其他內容。

布隆過濾器


布隆過濾器: 是一種基于Hash的高效查找結構,能夠快速(常數時間內)回答“某個原始是否在一個集合內”的問題。

應用場景:布隆過濾器因為其高效性大量應用于網絡和安全領域,例如信息檢索、垃圾郵件規則、注冊管理等

基于Hash的查找

基于Hash的快速查找算法: Hash可以將任意內容映射到一個固定長度的字符串,而且不同內容映射到相同串的概率很小。因此,可構成以個很好的“內容——》索引”的生成關系。(內容Hash后為索引通過索引可在數組中快速的查找當前內容)

基于Hash的快速查找算法的缺點:當映射后的值限制在一定范圍(如總數組的大小)內時,會發現 Hash 沖突的概率會變高,而且范 圍越小,沖突概率越大。很多時候,存儲系統的大小又不能無限擴展,這就造成算法效率的下降。為了提高空間利用率,后來人們基于Hash算法思想設計出了布隆過濾器結構。

更高效的布隆過濾器

布隆過濾器: 采用多個Hash函數來提高空間利用率。對于同一個給定輸入來說,多個Hash函數計算出多個地址,分別在位串的這些地址上標記為1。進行查找時,進行同樣的計算過程,并查看對應原始,如果都為1,則說明較大概率是存在該輸入。

優點:大大提高了空間利用率,可以使用較少的空間來表示較大集合的存在關系。

總結: 無論是Hash算法,還是布隆過濾器,基本思想都是基于內容的編址。Hash函數存在沖突,布隆過濾器也存在沖突。這就造成了兩種方法都存在誤報的情況,但絕對不會漏報。

同態加密


同態加密

同態加密: 是一種特殊的加密方法,允許對密文進行處理得到任然是加密的結果。即對密文直接進行處理,跟對明文進行處理后再對處理結果加密,得到的結果相同。
優點:同態加密可以保證實現處理者無法訪問到數據自身的信息

問題與挑戰

同態加密的兩個應用場景:

  • 同態加密在云計算和大數據時代意義十分重大。從安全角度講,用戶還不敢將敏感信息直接放到第三方云上進行處理。如果有了比較實用的同態加密技術,則可以放心實用各種云服務,同時各種數據分析過程也不會泄露用戶隱私
  • 對于區塊鏈技術,實用同態加密技術,運行在區塊鏈上的只能合約可以處理密文,而無法獲知真實數據,極大地提高了隱私安全性。

目前全同態的加密方案主要包括“基于理想個的方案”、“基于整數上近似GCD問題的方案”、“基于帶擾動學習問題的方案”。已知的同態加密技術往往需要較高的計算時間或存儲成本,相比傳統加密算法的性能和強度還有差距。

函數加密

同態加密保護的是數據本身,而函數加密保護的是處理函數本身,即讓第三方看不到處理過程的前提下,對數據進行處理。

其他問題


零知識證明

零知識證明: 證明者在不想驗證者提供任何額外信息的前提下,使驗證者相信某個論斷是正確的。

零知識證明至少要滿足三個條件:

  • 完整性: 真實的證明可以讓驗證者成功驗證
  • 可靠性: 虛假的證明無法讓驗證者保證通過驗證,但允許存在小概率例外
  • 零知識: 如果得到證明,無法從證明過程中獲知除了所證明信息之外的任何信息

量子密碼學

量子密碼學:隨著量子計算和量子通信的研究而受到越來越多的關注,將會對已有的密碼學安全機制產生較大的影響。

社交工程學

即便存在理論上完美的技術,也不存在完美的系統!
個人理解:系統中有人的組成部分并不是堅不可破的,因為人帶有社會屬性,通過社會學攻擊可以輕易的攻破理論上完美的系統。

總結


image.png
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,908評論 6 541
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,324評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,018評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,675評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,417評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,783評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,779評論 3 446
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,960評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,522評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,267評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,471評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,009評論 5 363
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,698評論 3 348
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,099評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,386評論 1 294
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,204評論 3 398
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,436評論 2 378

推薦閱讀更多精彩內容