iOS app簽名原理

轉:WeRead團隊博客
http://wereadteam.github.io/2017/03/13/Signature/

iOS 簽名機制挺復雜蠢终,各種證書,Provisioning Profile止喷,entitlements,CertificateSigningRequest,p12捣染,AppID冤议,概念一堆斟薇,也很容易出錯,本文嘗試從原理出發(fā)恕酸,一步步推出為什么會有這么多概念堪滨,希望能有助于理解 iOS App 簽名的原理和流程。

目的

先來看看蘋果的簽名機制是為了做什么蕊温。在 iOS 出來之前袱箱,在主流操作系統(tǒng)(Mac/Windows/Linux)上開發(fā)和運行軟件是不需要簽名的,軟件隨便從哪里下載都能運行义矛,導致平臺對第三方軟件難以控制发笔,盜版流行。蘋果希望解決這樣的問題凉翻,在 iOS 平臺對第三方 APP 有絕對的控制權了讨,一定要保證每一個安裝到 iOS 上的 APP 都是經(jīng)過蘋果官方允許的,怎樣保證呢制轰?就是通過簽名機制前计。

非對稱加密

通常我們說的簽名就是數(shù)字簽名,它是基于非對稱加密算法實現(xiàn)的垃杖。對稱加密是通過同一份密鑰加密和解密數(shù)據(jù)残炮,而非對稱加密則有兩份密鑰,分別是公鑰和私鑰缩滨,用公鑰加密的數(shù)據(jù)势就,要用私鑰才能解密泉瞻,用私鑰加密的數(shù)據(jù),要用公鑰才能解密苞冯。

簡單說一下常用的非對稱加密算法 RSA 的數(shù)學原理袖牙,理解簡單的數(shù)學原理,就可以理解非對稱加密是怎么做到的舅锄,為什么會是安全的:

  1. 選兩個質(zhì)數(shù)pq鞭达,相乘得出一個大整數(shù)n,例如
    p=61皇忿,q=53畴蹭,n=pq=3233
  2. 選 1-n 間的隨便一個質(zhì)數(shù) e,例如 e = 17
  3. 經(jīng)過一系列數(shù)學公式鳍烁,算出一個數(shù)字 d叨襟,滿足:

a. 通過 ne 這兩個數(shù)據(jù)一組數(shù)據(jù)進行數(shù)學運算后,可以通過 nd 去反解運算幔荒,反過來也可以糊闽。
b. 如果只知道 ne,要推導出 d爹梁,需要知道 pq右犹,也就是要需要把 n 因數(shù)分解。

上述的 (n,e)這兩個數(shù)據(jù)在一起就是公鑰姚垃,(n,d) 這兩個數(shù)據(jù)就是私鑰念链,滿足用公鑰加密,私鑰解密积糯,或反過來公鑰加密钓账,私鑰解密,也滿足在只暴露公鑰(只知道ne)的情況下絮宁,要推導出私鑰 (n,d)梆暮,需要把大整數(shù) n 因數(shù)分解。目前因數(shù)分解只能靠暴力窮舉绍昂,而n數(shù)字越大啦粹,越難以用窮舉計算出因數(shù) pq,也就越安全窘游,當 n大到二進制 1024 位或 2048 位時唠椭,以目前技術要破解幾乎不可能,所以非常安全忍饰。

若對數(shù)字 d 是怎樣計算出來的感興趣贪嫂,可以詳讀這兩篇文章:RSA 算法原理(一)(二)

數(shù)字簽名

現(xiàn)在知道了有非對稱加密這東西,那數(shù)字簽名是怎么回事呢艾蓝?

數(shù)字簽名的作用是我對某一份數(shù)據(jù)打個標記力崇,表示我認可了這份數(shù)據(jù)(簽了個名)斗塘,然后我發(fā)送給其他人,其他人可以知道這份數(shù)據(jù)是經(jīng)過我認證的亮靴,數(shù)據(jù)沒有被篡改過馍盟。

有了上述非對稱加密算法,就可以實現(xiàn)這個需求:

  1. 首先用一種算法茧吊,算出原始數(shù)據(jù)的摘要贞岭。需滿足 a.若原始數(shù)據(jù)有任何變化,計算出來的摘要值都會變化搓侄。 b.摘要要夠短瞄桨。這里最常用的算法是MD5。
  2. 生成一份非對稱加密的公鑰和私鑰讶踪,私鑰我自己拿著芯侥,公鑰公布出去。
  3. 對一份數(shù)據(jù)俊柔,算出摘要后筹麸,用私鑰加密這個摘要活合,得到一份加密后的數(shù)據(jù)雏婶,稱為原始數(shù)據(jù)的簽名。把它跟原始數(shù)據(jù)一起發(fā)送給用戶白指。
  4. 用戶收到數(shù)據(jù)和簽名后留晚,用公鑰解密得到摘要。同時用戶用同樣的算法計算原始數(shù)據(jù)的摘要告嘲,對比這里計算出來的摘要和用公鑰解密簽名得到的摘要是否相等错维,若相等則表示這份數(shù)據(jù)中途沒有被篡改過,因為如果篡改過橄唬,摘要會變化赋焕。

之所以要有第一步計算摘要,是因為非對稱加密的原理限制可加密的內(nèi)容不能太大(不能大于上述 n 的位數(shù)仰楚,也就是一般不能大于 1024 位/ 2048 位)隆判,于是若要對任意大的數(shù)據(jù)簽名,就需要改成對它的特征值簽名僧界,效果是一樣的侨嘀。

好了,有了非對稱加密的基礎捂襟,知道了數(shù)字簽名是什么咬腕,怎樣可以保證一份數(shù)據(jù)是經(jīng)過某個地方認證的,來看看怎樣通過數(shù)字簽名的機制保證每一個安裝到 iOS 上的 APP 都是經(jīng)過蘋果認證允許的葬荷。

最簡單的簽名

要實現(xiàn)這個需求很簡單涨共,最直接的方式纽帖,蘋果官方生成一對公私鑰,在 iOS 里內(nèi)置一個公鑰煞赢,私鑰由蘋果后臺保存抛计,我們傳 App 上 AppStore 時,蘋果后臺用私鑰對 APP 數(shù)據(jù)進行簽名照筑,iOS 系統(tǒng)下載這個 APP 后吹截,用公鑰驗證這個簽名,若簽名正確凝危,這個 APP 肯定是由蘋果后臺認證的波俄,并且沒有被修改過,也就達到了蘋果的需求:保證安裝的每一個 APP 都是經(jīng)過蘋果官方允許的蛾默。

如果我們 iOS 設備安裝 APP 只有從 AppStore 下載這一種方式的話懦铺,這件事就結束了,沒有任何復雜的東西支鸡,只有一個數(shù)字簽名冬念,非常簡單地解決問題。

但實際上因為除了從 AppStore 下載牧挣,我們還可以有三種方式安裝一個 App:

  1. 開發(fā) App 時可以直接把開發(fā)中的應用安裝進手機進行調(diào)試急前。
  2. In-House 企業(yè)內(nèi)部分發(fā),可以直接安裝企業(yè)證書簽名后的 APP瀑构。
  3. AD-Hoc 相當于企業(yè)分發(fā)的限制版裆针,限制安裝設備數(shù)量,較少用寺晌。

蘋果要對用這三種方式安裝的 App 進行控制世吨,就有了新的需求,無法像上面這樣簡單了呻征。

新的需求

我們先來看第一個耘婚,開發(fā)時安裝APP,它有兩個個需求:

  1. 安裝包不需要傳到蘋果服務器陆赋,可以直接安裝到手機上沐祷。如果你編譯一個 APP 到手機前要先傳到蘋果服務器簽名,這顯然是不能接受的奏甫。
  2. 蘋果必須對這里的安裝有控制權戈轿,包括
    a.經(jīng)過蘋果允許才可以這樣安裝。
    b.不能被濫用導致非開發(fā)app也能被安裝阵子。
    為了實現(xiàn)這些需求思杯,iOS 簽名的復雜度也就開始增加了。

蘋果這里給出的方案是使用了雙層簽名,會比較繞色乾,流程大概是這樣的:

  1. 在你的 Mac 開發(fā)機器生成一對公私鑰誊册,這里稱為公鑰L,私鑰L暖璧。L:Local
  2. 蘋果自己有固定的一對公私鑰案怯,跟上面 AppStore 例子一樣,私鑰在蘋果后臺澎办,公鑰在每個 iOS 設備上嘲碱。這里稱為公鑰A,私鑰A局蚀。A:Apple
  3. 把公鑰 L 傳到蘋果后臺麦锯,用蘋果后臺里的私鑰 A 去簽名公鑰 L。得到一份數(shù)據(jù)包含了公鑰 L 以及其簽名琅绅,把這份數(shù)據(jù)稱為證書扶欣。
  4. 在開發(fā)時,編譯完一個 APP 后千扶,用本地的私鑰 L 對這個 APP 進行簽名料祠,同時把第三步得到的證書一起打包進 APP 里,安裝到手機上澎羞。
  5. 在安裝時髓绽,iOS 系統(tǒng)取得證書,通過系統(tǒng)內(nèi)置的公鑰 A煤痕,去驗證證書的數(shù)字簽名是否正確梧宫。
  6. 驗證證書后確保了公鑰 L 是蘋果認證過的接谨,再用公鑰 L 去驗證 APP 的簽名摆碉,這里就間接驗證了這個 APP 安裝行為是否經(jīng)過蘋果官方允許。(這里只驗證安裝行為脓豪,不驗證APP 是否被改動巷帝,因為開發(fā)階段 APP 內(nèi)容總是不斷變化的,蘋果不需要管扫夜。)

加點東西

上述流程只解決了上面第一個需求楞泼,也就是需要經(jīng)過蘋果允許才可以安裝,還未解決第二個避免被濫用的問題笤闯。怎么解決呢堕阔?蘋果再加了兩個限制,一是限制在蘋果后臺注冊過的設備才可以安裝颗味,二是限制簽名只能針對某一個具體的 APP超陆。

怎么加的?在上述第三步浦马,蘋果用私鑰 A 簽名我們本地公鑰 L 時时呀,實際上除了簽名公鑰 L张漂,還可以加上無限多數(shù)據(jù),這些數(shù)據(jù)都可以保證是經(jīng)過蘋果官方認證的谨娜,不會有被篡改的可能航攒。

可以想到把 允許安裝的設備 ID 列表 和 App對應的 AppID 等數(shù)據(jù),都在第三步這里跟公鑰L一起組成證書趴梢,再用蘋果私鑰 A 對這個證書簽名漠畜。在最后第 5 步驗證時就可以拿到設備 ID 列表,判斷當前設備是否符合要求坞靶。根據(jù)數(shù)字簽名的原理盆驹,只要數(shù)字簽名通過驗證,第 5 步這里的設備 IDs / AppID / 公鑰 L 就都是經(jīng)過蘋果認證的滩愁,無法被修改躯喇,蘋果就可以限制可安裝的設備和 APP,避免濫用硝枉。

最終流程

到這里這個證書已經(jīng)變得很復雜了廉丽,有很多額外信息,實際上除了 設備 ID / AppID妻味,還有其他信息也需要在這里用蘋果簽名正压,像這個 APP 里 iCloud / push / 后臺運行 等權限蘋果都想控制,蘋果把這些權限開關統(tǒng)一稱為 Entitlements责球,它也需要通過簽名去授權焦履。

實際上一個“證書”本來就有規(guī)定的格式規(guī)范,上面我們把各種額外信息塞入證書里是不合適的雏逾,于是蘋果另外搞了個東西嘉裤,叫 Provisioning Profile,一個 Provisioning Profile 里就包含了證書以及上述提到的所有額外信息栖博,以及所有信息的簽名屑宠。

所以整個流程稍微變一下,就變成這樣了:

因為步驟有小變動仇让,這里我們不辭啰嗦重新再列一遍整個流程:

  1. 在你的 Mac 開發(fā)機器生成一對公私鑰典奉,這里稱為公鑰L,私鑰L丧叽。L:Local
  2. 蘋果自己有固定的一對公私鑰卫玖,跟上面 AppStore 例子一樣,私鑰在蘋果后臺踊淳,公鑰在每個 iOS 設備上假瞬。這里稱為公鑰A,私鑰A。A:Apple
  3. 把公鑰 L 傳到蘋果后臺笨触,用蘋果后臺里的私鑰 A 去簽名公鑰 L懦傍。得到一份數(shù)據(jù)包含了公鑰 L 以及其簽名,把這份數(shù)據(jù)稱為證書芦劣。
  4. 在蘋果后臺申請 AppID粗俱,配置好設備 ID 列表和 APP 可使用的權限,再加上第③步的證書虚吟,組成的數(shù)據(jù)用私鑰 A 簽名寸认,把數(shù)據(jù)和簽名一起組成一個 Provisioning Profile 文件,下載到本地 Mac 開發(fā)機串慰。
  5. 在開發(fā)時偏塞,編譯完一個 APP 后,用本地的私鑰 L 對這個 APP 進行簽名邦鲫,同時把第④步得到的 Provisioning Profile 文件打包進 APP 里灸叼,文件名為 embedded.mobileprovision,把 APP 安裝到手機上庆捺。
  6. 在安裝時古今,iOS 系統(tǒng)取得證書,通過系統(tǒng)內(nèi)置的公鑰 A滔以,去驗證 embedded.mobileprovision 的數(shù)字簽名是否正確捉腥,里面的證書簽名也會再驗一遍。
  7. 確保了 embedded.mobileprovision 里的數(shù)據(jù)都是蘋果授權以后你画,就可以取出里面的數(shù)據(jù)抵碟,做各種驗證,包括用公鑰 L 驗證APP簽名坏匪,驗證設備 ID 是否在 ID 列表上拟逮,AppID 是否對應得上,權限開關是否跟 APP 里的 Entitlements 對應等剥槐。

開發(fā)者證書從簽名到認證最終蘋果采用的流程大致是這樣唱歧,還有一些細節(jié)像證書有效期/證書類型等就不細說了宪摧。

概念和操作

上面的步驟對應到我們平常具體的操作和概念是這樣的:

  1. 第 1 步對應的是 keychain 里的 “從證書頒發(fā)機構請求證書”粒竖,這里就本地生成了一堆公私鑰,保存的 CertificateSigningRequest就是公鑰几于,私鑰保存在本地電腦里蕊苗。
  2. 第 2 步蘋果處理,不用管沿彭。
  3. 第 3 步對應把 CertificateSigningRequest 傳到蘋果后臺生成證書朽砰,并下載到本地。這時本地有兩個證書,一個是第 1 步生成的瞧柔,一個是這里下載回來的漆弄,keychain 會把這兩個證書關聯(lián)起來,因為他們公私鑰是對應的造锅,在XCode選擇下載回來的證書時撼唾,實際上會找到 keychain 里對應的私鑰去簽名。這里私鑰只有生成它的這臺 Mac 有哥蔚,如果別的 Mac 也要編譯簽名這個 App 怎么辦倒谷?答案是把私鑰導出給其他 Mac 用,在 keychain 里導出私鑰糙箍,就會存成 .p12 文件渤愁,其他 Mac 打開后就導入了這個私鑰。
  4. 第 4 步都是在蘋果網(wǎng)站上操作深夯,配置 AppID / 權限 / 設備等抖格,最后下載 Provisioning Profile 文件。
  5. 第 5 步 XCode 會通過第 3 步下載回來的證書(存著公鑰)咕晋,在本地找到對應的私鑰(第一步生成的)他挎,用本地私鑰去簽名 App,并把 Provisioning Profile文件命名為 embedded.mobileprovision 一起打包進去捡需。這里對 App 的簽名數(shù)據(jù)保存分兩部分办桨,Mach-O 可執(zhí)行文件會把簽名直接寫入這個文件里,其他資源文件則會保存在 _CodeSignature 目錄下站辉。

第 6 - 7 步的打包和驗證都是 Xcode 和 iOS 系統(tǒng)自動做的事呢撞。

這里再總結一下這些概念:

  1. 證書:內(nèi)容是公鑰或私鑰,由其他機構對其簽名組成的數(shù)據(jù)包饰剥。
  2. ** Entitlements**:包含了 App 權限開關列表殊霞。
  3. CertificateSigningRequest:本地公鑰。
  4. p12:本地私鑰汰蓉,可以導入到其他電腦绷蹲。
  5. Provisioning Profile:包含了 證書 / Entitlements 等數(shù)據(jù),并由蘋果后臺私鑰簽名的數(shù)據(jù)包顾孽。

其他發(fā)布方式

前面以開發(fā)包為例子說了簽名和驗證的流程祝钢,另外兩種方式 In-House 企業(yè)簽名和 AD-Hoc 流程也是差不多的,只是企業(yè)簽名不限制安裝的設備數(shù)若厚,另外需要用戶在 iOS 系統(tǒng)設置上手動點擊信任這個企業(yè)才能通過驗證拦英。

而 AppStore 的簽名驗證方式有些不一樣,前面我們說到最簡單的簽名方式测秸,蘋果在后臺直接用私鑰簽名 App 就可以了疤估,實際上蘋果確實是這樣做的灾常,如果去下載一個 AppStore 的安裝包,會發(fā)現(xiàn)它里面是沒有 embedded.mobileprovision 文件的铃拇,也就是它安裝和啟動的流程是不依賴這個文件钞瀑,驗證流程也就跟上述幾種類型不一樣了。

據(jù)猜測慷荔,因為上傳到 AppStore 的包蘋果會重新對內(nèi)容加密仔戈,原來的本地私鑰簽名就沒有用了,需要重新簽名拧廊,從 AppStore 下載的包蘋果也并不打算控制它的有效期监徘,不需要內(nèi)置一個 embedded.mobileprovision 去做校驗,直接在蘋果用后臺的私鑰重新簽名吧碾,iOS 安裝時用本地公鑰驗證 App 簽名就可以了凰盔。

那為什么發(fā)布 AppStore 的包還是要跟開發(fā)版一樣搞各種證書和 Provisioning Profile?猜測因為蘋果想做統(tǒng)一管理倦春,Provisioning Profile 里包含一些權限控制户敬,AppID 的檢驗等,蘋果不想在上傳 AppStore 包時重新用另一種協(xié)議做一遍這些驗證睁本,就不如統(tǒng)一把這部分放在 Provisioning Profile 里尿庐,上傳 AppStore 時只要用同樣的流程驗證這個 Provisioning Profile 是否合法就可以了。

所以 App 上傳到 AppStore 后呢堰,就跟你的 證書 / Provisioning Profile 都沒有關系了抄瑟,無論他們是否過期或被廢除,都不會影響 AppStore 上的安裝包枉疼。

到這里 iOS 簽名機制的原理和主流程大致說完了皮假,希望能對理解蘋果簽名和排查日常簽名問題有所幫助。

P.S.一些疑問

最后這里再提一下我關于簽名流程的一些的疑問骂维。

企業(yè)證書

企業(yè)證書簽名因為限制少惹资,在國內(nèi)被廣泛用于測試和盜版,fir.im / 蒲公英等測試平臺都是通過企業(yè)證書分發(fā)航闺,國內(nèi)一些市場像 PP 助手褪测,愛思助手,一部分安裝手段也是通過企業(yè)證書重簽名潦刃。通過企業(yè)證書簽名安裝的 App侮措,啟動時都會驗證證書的有效期彼绷,并且不定期請求蘋果服務器看證書是否被吊銷,若已過期或被吊銷藤肢,就會無法啟動 App厦取。對于這種助手的盜版安裝手段,蘋果想打擊只能一個個吊銷企業(yè)證書趁蕊,并沒有太好的辦法萧朝。

這里我的疑問是腊尚,蘋果做了那么多簽名和驗證機制去限制在 iOS 安裝 App略荡,為什么又要出這樣一個限制很少的方式讓盜版鉆空子呢庵佣?若真的是企業(yè)用途不適合上 AppStore,也完全可以在 AppStore 開辟一個小的私密版塊汛兜,還是通過 AppStore 去安裝巴粪,就不會有這個問題了。

AppStore 加密

另一個問題是我們把 App 傳上 AppStore 后粥谬,蘋果會對 App 進行加密肛根,導致 App 體積增大不少,這個加密實際上是沒卵用的漏策,只是讓破解的人要多做一個步驟派哲,運行 App 去內(nèi)存 dump 出可執(zhí)行文件而已,無論怎樣加密掺喻,都可以用這種方式拿出加密前的可執(zhí)行文件芭届。所以為什么要做這樣的加密呢?想不到有什么好處感耙。

本地私鑰

我們看到前面說的簽名流程很繞很復雜褂乍,經(jīng)常出現(xiàn)各種問題,像有 Provisioning Profile 文件但證書又不對即硼,本地有公鑰證書沒對應私鑰等情況逃片,不理解原理的情況下會被繞暈,我的疑問是只酥,這里為什么不能簡化呢题诵?還是以開發(fā)證書為例,為什么一定要用本地 Mac 生成的私鑰去簽名层皱?蘋果要的只是本地簽名性锭,私鑰不一定是要本地生成的,蘋果也可以自己生成一對公私鑰給我們叫胖,放在 Provisioning Profile 里草冈,我們用里面的私鑰去加密就行了,這樣就不會有 CertificateSigningRequest 和 p12 的概念瓮增,跟本地 keychain 沒有關系怎棱,不需要關心證書,只要有 Provisioning Profile 就能簽名绷跑,流程會減少拳恋,易用性會提高很多,同時蘋果想要的控制一點都不會少砸捏,也沒有什么安全問題谬运,為什么不這樣設計呢隙赁?

能想到的一個原因是 Provisioning Profile 在非 AppStore 安裝時會打包進安裝包,第三方拿到這個 Provisioning Profile 文件就能直接用起來給他自己的 App 簽名了梆暖。但這種問題也挺好解決伞访,只需要打包時去掉文件里的私鑰就行了,所以仍不明白為什么這樣設計轰驳。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末厚掷,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子级解,更是在濱河造成了極大的恐慌冒黑,老刑警劉巖,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件勤哗,死亡現(xiàn)場離奇詭異抡爹,居然都是意外死亡,警方通過查閱死者的電腦和手機俺陋,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進店門豁延,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人腊状,你說我怎么就攤上這事诱咏。” “怎么了缴挖?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵袋狞,是天一觀的道長。 經(jīng)常有香客問我映屋,道長苟鸯,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任棚点,我火速辦了婚禮早处,結果婚禮上,老公的妹妹穿的比我還像新娘瘫析。我一直安慰自己砌梆,他們只是感情好,可當我...
    茶點故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布贬循。 她就那樣靜靜地躺著咸包,像睡著了一般。 火紅的嫁衣襯著肌膚如雪杖虾。 梳的紋絲不亂的頭發(fā)上烂瘫,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天,我揣著相機與錄音奇适,去河邊找鬼坟比。 笑死芦鳍,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的温算。 我是一名探鬼主播怜校,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼间影,長吁一口氣:“原來是場噩夢啊……” “哼注竿!你這毒婦竟也來了?” 一聲冷哼從身側響起魂贬,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤巩割,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后付燥,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體宣谈,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年键科,在試婚紗的時候發(fā)現(xiàn)自己被綠了闻丑。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡勋颖,死狀恐怖嗦嗡,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情饭玲,我是刑警寧澤侥祭,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站茄厘,受9級特大地震影響矮冬,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜次哈,卻給世界環(huán)境...
    茶點故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一胎署、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧窑滞,春花似錦琼牧、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至聊训,卻和暖如春抱究,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背带斑。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工鼓寺, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留勋拟,地道東北人。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓妈候,卻偏偏與公主長得像敢靡,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子苦银,可洞房花燭夜當晚...
    茶點故事閱讀 42,925評論 2 344

推薦閱讀更多精彩內(nèi)容