iOS開(kāi)發(fā)中的HTTPS

提出問(wèn)題

蘋(píng)果公司在2016的開(kāi)發(fā)者大會(huì)上宣布:到2017年赡矢,所有的iOS應(yīng)用都必須使用HTTPS與服務(wù)器進(jìn)行通信烦却。iOS開(kāi)發(fā)者應(yīng)該都不會(huì)對(duì)這個(gè)決定感到驚訝蹦误,因?yàn)樽詉OS9就已經(jīng)引入了ATS(應(yīng)用傳輸安全App Transport Security)特性咱筛,該特性對(duì)應(yīng)用的安全傳輸做出了以下要求:

The protocol Transport Security Layer (TLS) must be at least version 1.2.
Connection ciphers are limited to those that provide forward secrecy (see the list of ciphers below.)
Certificates must use at least an SHA256 fingerprint with either a 2048 bit or greater RSA key, or a 256 bit or greater Elliptic-Curve (ECC) key.

不符合以上條件的任意一項(xiàng)彼妻,網(wǎng)絡(luò)請(qǐng)求將會(huì)被中斷并返回空值嫌佑。

既然蘋(píng)果公司劃出了最后期限,HTTPS將成為必然侨歉,那么一個(gè)iOS開(kāi)發(fā)自學(xué)者自然會(huì)提出以下問(wèn)題:

  • HTTPS的原理和運(yùn)行機(jī)制是什么屋摇?

  • 為實(shí)現(xiàn)HTTPS通信,服務(wù)器端需要做什么幽邓?

  • 為實(shí)現(xiàn)HTTPS通信炮温,iOS客戶端需要做什么

HTTPS的原理及運(yùn)行機(jī)制

網(wǎng)絡(luò)上有很多對(duì)于SSL/TLS協(xié)議進(jìn)行講解的文章牵舵,比如SSL/TLS協(xié)議運(yùn)行機(jī)制的概述圖解SSL/TLS協(xié)議兩篇就很不錯(cuò)柒啤,推薦閱讀。閱讀之后能基本理解HTTPS的原理和運(yùn)行機(jī)制畸颅,本小節(jié)簡(jiǎn)要?dú)w納自己的理解担巩。

首先,不使用SSL/TLS的HTTP通信重斑,是不加密的通信兵睛,這顯然不能保證客戶的信息安全。在上一篇功課iOS開(kāi)發(fā)中使用keyChain保存用戶密碼中窥浪,辛辛苦苦地將用戶名密碼能夠安全地存儲(chǔ)在keyChain中(不越獄的前提下)祖很,但是如果用戶名密碼就這樣明文地發(fā)送出去,一旦被截獲漾脂,后果可想而知假颇。當(dāng)然,我們很自然地就會(huì)想到將用戶密碼字符串進(jìn)行MD5加密后骨稿,再通過(guò)網(wǎng)絡(luò)發(fā)送給服務(wù)器笨鸡,比如:

NSString *sourceStr = [NSString stringWithFormat:@"attach=iOS&chartset=utf-8&format=json&partner=google&userid=%@&password=%@”,userid,password];
NSString *signStr = [NSString md5String:sourceStr];

但即便如此也不能保證安全,因?yàn)榇嬖?strong>碰撞攻擊坦冠。關(guān)于碰撞攻擊形耗,可以閱讀安全科普:密碼學(xué)之碰撞攻擊一文。

于是辙浑,為了實(shí)現(xiàn)通信的安全激涤,SSL/TLS協(xié)議采用公鑰加密法,其運(yùn)行的基本流程是:

1判呕、客戶端向服務(wù)器端索要并驗(yàn)證公鑰倦踢;
2送滞、雙方協(xié)商生成"對(duì)話密鑰";
3辱挥、雙方采用"對(duì)話密鑰"進(jìn)行加密通信犁嗅。

其中,第1和2步被稱為握手階段晤碘。握手階段的細(xì)節(jié)這里就不贅述褂微,我們只需要知道,通過(guò)握手階段哼蛆,客戶端和服務(wù)器端主要交換了3個(gè)信息:

  • 數(shù)字證書(shū)蕊梧。該信息是我們進(jìn)行開(kāi)發(fā)需要關(guān)注的!數(shù)字證書(shū)包含了公鑰等信息腮介,一般由服務(wù)器發(fā)給客戶端肥矢,接收方通過(guò)驗(yàn)證這個(gè)證書(shū)是不是由信賴的CA簽發(fā),或者與本地的證書(shū)相對(duì)比叠洗,來(lái)判斷證書(shū)是否可信甘改;假如需要雙向驗(yàn)證,則服務(wù)器和客戶端都需要發(fā)送數(shù)字證書(shū)給對(duì)方驗(yàn)證灭抑;
  • 3個(gè)隨機(jī)數(shù)十艾。3個(gè)隨機(jī)數(shù)是用于生成對(duì)話密鑰的,我們不需要關(guān)心這細(xì)節(jié)腾节;
  • 加密通信協(xié)議忘嫉。客戶端和服務(wù)器端通信需要采取同樣的加密通信協(xié)議案腺,我們也不需要太關(guān)注庆冕。

數(shù)字證書(shū)與公鑰基礎(chǔ)設(shè)施

對(duì)于不大接觸網(wǎng)絡(luò)安全的同學(xué),看了上面的原理劈榨,可能和我一樣也是充滿問(wèn)題访递,這是因?yàn)槲覀兪前肼烦黾遥炔恢理攲訕?gòu)架同辣,又不接地氣拷姿。但是如果對(duì)于公鑰基礎(chǔ)設(shè)施(PKI)和數(shù)字證書(shū)的關(guān)系有了一個(gè)直觀的理解,疑惑就會(huì)迎刃而解旱函。

剛才已經(jīng)了解到HTTPS是基于公鑰加密法响巢,而公鑰基礎(chǔ)設(shè)施(PKI)就是一種遵循標(biāo)準(zhǔn)的利用公鑰加密技術(shù)為電子商務(wù)的開(kāi)展提供一套安全基礎(chǔ)平臺(tái)的技術(shù)和規(guī)范。完整的PKI系統(tǒng)擁有權(quán)威認(rèn)證機(jī)構(gòu)(CA)棒妨、數(shù)字證書(shū)庫(kù)抵乓、密鑰備份及恢復(fù)系統(tǒng)、證書(shū)作廢系統(tǒng)、應(yīng)用接口(API)等基本構(gòu)成部分灾炭,其中權(quán)威認(rèn)證機(jī)構(gòu)CA將是我們需要打交道的部門(mén)

該系統(tǒng)的邏輯關(guān)系可以這樣理解:

  • 申請(qǐng)人向CA提交申請(qǐng)材料颅眶;

  • 數(shù)字證書(shū)是由證書(shū)認(rèn)證機(jī)構(gòu)(CA)對(duì)證書(shū)申請(qǐng)者真實(shí)身份驗(yàn)證之后蜈出,用CA的根證書(shū)對(duì)申請(qǐng)人的一些基本信息以及申請(qǐng)人的公鑰進(jìn)行簽名(相當(dāng)于加蓋發(fā)證書(shū)機(jī)構(gòu)的公章)后形成的一個(gè)數(shù)字文件。CA完成簽發(fā)證書(shū)后涛酗,會(huì)將證書(shū)發(fā)布在CA的證書(shū)庫(kù)(目錄服務(wù)器)中铡原,任何人都可以查詢和下載,因此數(shù)字證書(shū)和公鑰一樣是公開(kāi)的商叹。

  • 每個(gè)證書(shū)持有人都有一對(duì)公鑰和私鑰燕刻,這兩把密鑰可以互為加解密。公鑰是公開(kāi)的剖笙,不需要保密卵洗,而私鑰是由證書(shū)持有人自己持有,并且必須妥善保管和注意保密弥咪。

  • 簡(jiǎn)單地說(shuō)过蹂,數(shù)字證書(shū)就是經(jīng)過(guò)CA認(rèn)證過(guò)的公鑰,而私鑰一般情況都是由證書(shū)持有者在自己本地生成的聚至,由證書(shū)持有者自己負(fù)責(zé)保管酷勺。

至此,邏輯鏈條就和SSL/TLS協(xié)議運(yùn)行機(jī)制銜接上了:申請(qǐng)人事先通過(guò)向CA申請(qǐng)扳躬,已經(jīng)有了公鑰和私鑰脆诉。客戶端向服務(wù)器請(qǐng)求贷币,能夠得到包含公鑰的數(shù)字證書(shū)击胜。得到公鑰后,雙方就按照上節(jié)中運(yùn)行的基本流程生成對(duì)話密鑰片择,而后開(kāi)始加密通信潜的。如果對(duì)于數(shù)字證書(shū)和CA之間的關(guān)系還不是很清楚,建議閱讀數(shù)字證書(shū)及CA的掃盲介紹一文字管。

思維比較敏銳的同學(xué)也許會(huì)問(wèn):

我怎么知道數(shù)字證書(shū)是由CA簽發(fā)的啰挪,而不是第三方偽造的呢?

問(wèn)得好嘲叔!簡(jiǎn)單地說(shuō)亡呵,就是用CA的組織結(jié)構(gòu)和數(shù)字證書(shū)的簽發(fā)流程來(lái)保證,具體細(xì)節(jié)在這里不討論硫戈,感興趣的同學(xué)可以閱讀iOS安全系列之一:HTTPS一文锰什。

小結(jié):客戶端向服務(wù)器發(fā)出請(qǐng)求得到包含公鑰的數(shù)字證書(shū),數(shù)字證書(shū)的真實(shí)性是由CA來(lái)進(jìn)行保證≈ǎ基于公鑰梭姓,客戶端和服務(wù)器端能夠通過(guò)“握手”建立加密的通信。

服務(wù)器端如何實(shí)現(xiàn)HTTPS

如何實(shí)現(xiàn)嫩码,肯定得靠自己搭建一個(gè)HTTPS服務(wù)器啊誉尖。根據(jù)網(wǎng)絡(luò)上的資料,可知有兩種方式來(lái)搭建HTTPS服務(wù)器:

  • 一種是創(chuàng)建證書(shū)請(qǐng)求铸题,然后到權(quán)威機(jī)構(gòu)認(rèn)證铡恕,隨之配置到服務(wù)器;
  • 一種是自建證書(shū)丢间,然后配置給服務(wù)器探熔。

第一種方式搭建的HTTPS服務(wù)器是最優(yōu)的。建立網(wǎng)站的話烘挫,直接就會(huì)被信任诀艰。而服務(wù)器作為移動(dòng)端app的服務(wù)器時(shí),也不需要為ATS做過(guò)多的適配(正是我所需要積累知識(shí)的方向)墙牌。雖然說(shuō)權(quán)威的機(jī)構(gòu)認(rèn)證都是需要錢(qián)的涡驮,但是如今也不乏存在免費(fèi)的第三方認(rèn)證機(jī)構(gòu);

第二種方式搭建的HTTPS服務(wù)器喜滨,對(duì)于網(wǎng)站來(lái)說(shuō)完全不可行捉捅,用戶打開(kāi)時(shí)直接彈出一個(gè)警告提醒,說(shuō)這是一個(gè)不受信任的網(wǎng)站虽风,讓用戶是否繼續(xù)棒口,體驗(yàn)很差,而且讓用戶感覺(jué)網(wǎng)站不安全辜膝。對(duì)于移動(dòng)端來(lái)說(shuō)无牵,在iOS9出現(xiàn)之前,這個(gè)沒(méi)什么問(wèn)題厂抖,但是在iOS9出來(lái)之后茎毁,第二種方式是通不過(guò)ATS特性,需要在info.plist文件中將App Transport Security Settings中的Allow Arbitrary Loads設(shè)置為YES才行忱辅。

在本文中七蜘,為了快速地驗(yàn)證iOS端與HTTPS服務(wù)器能夠不需要為ATS做過(guò)多的適配,采取了選擇一個(gè)現(xiàn)成的HTTPS服務(wù)器來(lái)做驗(yàn)證的方式墙懂。那么如何才能知道一個(gè)HTTPS服務(wù)器是符合ATS特性中的要求的呢橡卤?使用nscurl命令如下:

nscurl --ats-diagnostics --verbose https://example.com

命令后接的URL可以使你想要檢測(cè)的HTTPS服務(wù)器地址。接下來(lái)损搬,讓我們看看知乎能不能通過(guò)ATS檢測(cè)碧库,在終端中輸入命令:

nscurl --ats-diagnostics --verbose https://www.zhihu.com

輸出如下:

Starting ATS Diagnostics

Configuring ATS Info.plist keys and displaying the result of HTTPS loads to https://www.zhihu.com.
A test will "PASS" if URLSession:task:didCompleteWithError: returns a nil error.
=======================================================================

Default ATS Secure Connection
---
ATS Default Connection
ATS Dictionary:
{
}
Result : PASS
---

=======================================================================

Allowing Arbitrary Loads

---
Allow All Loads
ATS Dictionary:
{
    NSAllowsArbitraryLoads = true;
}
Result : PASS
---

=======================================================================

Configuring TLS exceptions for www.zhihu.com

---
TLSv1.2
ATS Dictionary:
{
    NSExceptionDomains =     {
        "www.zhihu.com" =         {
            NSExceptionMinimumTLSVersion = "TLSv1.2";
        };
    };
}
Result : PASS
---

---
TLSv1.1
ATS Dictionary:
{
    NSExceptionDomains =     {
        "www.zhihu.com" =         {
            NSExceptionMinimumTLSVersion = "TLSv1.1";
        };
    };
}
Result : PASS
---

---
TLSv1.0
ATS Dictionary:
{
    NSExceptionDomains =     {
        "www.zhihu.com" =         {
            NSExceptionMinimumTLSVersion = "TLSv1.0";
        };
    };
}
Result : PASS
---

=======================================================================

Configuring PFS exceptions for www.zhihu.com

---
Disabling Perfect Forward Secrecy
ATS Dictionary:
{
    NSExceptionDomains =     {
        "www.zhihu.com" =         {
            NSExceptionRequiresForwardSecrecy = false;
        };
    };
}
Result : PASS
---

=======================================================================

Configuring PFS exceptions and allowing insecure HTTP for www.zhihu.com

---
Disabling Perfect Forward Secrecy and Allowing Insecure HTTP
ATS Dictionary:
{
    NSExceptionDomains =     {
        "www.zhihu.com" =         {
            NSExceptionAllowsInsecureHTTPLoads = true;
            NSExceptionRequiresForwardSecrecy = false;
        };
    };
}
Result : PASS
---

=======================================================================

Configuring TLS exceptions with PFS disabled for www.zhihu.com

---
TLSv1.2 with PFS disabled
ATS Dictionary:
{
    NSExceptionDomains =     {
        "www.zhihu.com" =         {
            NSExceptionMinimumTLSVersion = "TLSv1.2";
            NSExceptionRequiresForwardSecrecy = false;
        };
    };
}
Result : PASS
---

---
TLSv1.1 with PFS disabled
ATS Dictionary:
{
    NSExceptionDomains =     {
        "www.zhihu.com" =         {
            NSExceptionMinimumTLSVersion = "TLSv1.1";
            NSExceptionRequiresForwardSecrecy = false;
        };
    };
}
Result : PASS
---

---
TLSv1.0 with PFS disabled
ATS Dictionary:
{
    NSExceptionDomains =     {
        "www.zhihu.com" =         {
            NSExceptionMinimumTLSVersion = "TLSv1.0";
            NSExceptionRequiresForwardSecrecy = false;
        };
    };
}
Result : PASS
---

=======================================================================

Configuring TLS exceptions with PFS disabled and insecure HTTP allowed for www.zhihu.com

---
TLSv1.2 with PFS disabled and insecure HTTP allowed
ATS Dictionary:
{
    NSExceptionDomains =     {
        "www.zhihu.com" =         {
            NSExceptionAllowsInsecureHTTPLoads = true;
            NSExceptionMinimumTLSVersion = "TLSv1.2";
            NSExceptionRequiresForwardSecrecy = false;
        };
    };
}
Result : PASS
---

---
TLSv1.1 with PFS disabled and insecure HTTP allowed
ATS Dictionary:
{
    NSExceptionDomains =     {
        "www.zhihu.com" =         {
            NSExceptionAllowsInsecureHTTPLoads = true;
            NSExceptionMinimumTLSVersion = "TLSv1.1";
            NSExceptionRequiresForwardSecrecy = false;
        };
    };
}
Result : PASS
---

---
TLSv1.0 with PFS disabled and insecure HTTP allowed
ATS Dictionary:
{
    NSExceptionDomains =     {
        "www.zhihu.com" =         {
            NSExceptionAllowsInsecureHTTPLoads = true;
            NSExceptionMinimumTLSVersion = "TLSv1.0";
            NSExceptionRequiresForwardSecrecy = false;
        };
    };
}
Result : PASS
---
=====================================================================

可以看到知乎在所有的測(cè)試案例中都是PASS柜与,由此證明知乎通過(guò)了ATS檢測(cè),給知乎對(duì)于用戶信息安全的保護(hù)點(diǎn)個(gè)贊嵌灰。

然后弄匕,進(jìn)入喜聞樂(lè)見(jiàn)的黑百度時(shí)間:

nscurl --ats-diagnostics --verbose https://www.baidu.com

然而結(jié)果顯示,百度同樣通過(guò)了ATS測(cè)試伞鲫,所以說(shuō)百度做得也不錯(cuò)粘茄。最后被黑到的是新浪微博,感興趣的知友可以試試秕脓,這里就不贅述了。現(xiàn)在我們已經(jīng)有了百度和知乎這兩個(gè)HTTPS服務(wù)器儒搭,接下來(lái)就看客戶端是否能夠成功訪問(wèn)了吠架。

iOS端如何實(shí)現(xiàn)HTTPS

基于對(duì)HTTPS運(yùn)行機(jī)制的理解,我們知道搂鲫,在iOS客戶端實(shí)現(xiàn)與服務(wù)器的HTTPS通信傍药,前提條件是你服務(wù)器是一個(gè)提供了HTTPS的服務(wù)器。如果前提得以滿足魂仍,那么iOS客戶端就需要向服務(wù)器發(fā)出請(qǐng)求索要公鑰拐辽,而后驗(yàn)證公鑰,然后進(jìn)行握手擦酌,左后開(kāi)始加密通信俱诸。那么,具體怎么做呢赊舶?難倒這些都需要我自己實(shí)現(xiàn)嗎睁搭?肯定不是的,這種基礎(chǔ)性工作笼平,蘋(píng)果早就做好了园骆,著名的第三方庫(kù)AFNetworking也早就做好了。本文中主要學(xué)習(xí)和實(shí)踐基于AFNetworking的通信寓调。

在上文中提到過(guò)锌唾,經(jīng)過(guò)CA認(rèn)證的HTTPS服務(wù)器是最好的,在iOS客戶端這里基本上不需要做太多ATS適配夺英,現(xiàn)在我們就嘗試一下晌涕。在上篇功課使用CocoaPods安裝AFNetworking并測(cè)試中,已經(jīng)通過(guò)設(shè)置ATS能夠?qū)崿F(xiàn)HTTP的GET網(wǎng)絡(luò)請(qǐng)求秋麸,這里我們就基于該項(xiàng)目進(jìn)行修改如下:

  • 首先渐排,刪除掉info.plist文件中App Transport Security Settings及其子項(xiàng)Allow Arbitrary Loads,讓ATS恢復(fù)到默認(rèn)狀態(tài)灸蟆。
  • 其次驯耻,修改viewDidLoad方法中的代碼亲族,主要將url修改為HTTPS服務(wù)器的url:
- (void)viewDidLoad {
    [super viewDidLoad];
    // 將上次實(shí)驗(yàn)的URL注釋掉
    // NSString *urlString = @"http://api.jirengu.com/weather.php";
    // NSString *urlString = @"http://itunes.apple.com/search?term=metallica";

    // 使用baidu的HTTPS鏈接
    NSString *urlString = @"https://www.baidu.com";
    NSURL *url = [NSURL URLWithString:urlString];
    
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
    [manager GET:url.absoluteString parameters:nil progress:nil success:^(NSURLSessionDataTask *task, id responseObject) {
        
        NSLog(@"results: %@", responseObject);
        
    } failure:^(NSURLSessionDataTask *task, NSError *error) {
        
        NSLog(@"results: %@", error);
        
    }];

}

運(yùn)行項(xiàng)目,得到報(bào)錯(cuò)如下:

...JSON text did not start with array or object and option to allow fragments not set

通過(guò)查詢可缚,發(fā)現(xiàn)問(wèn)題是因?yàn)锳FNetworking默認(rèn)把請(qǐng)求的相應(yīng)結(jié)果認(rèn)為是JSON數(shù)據(jù)霎迫,然而實(shí)際上我們輸入百度的地址,得到的應(yīng)該是html數(shù)據(jù)帘靡。但是AFNetworking并不知道知给,它堅(jiān)信請(qǐng)求的結(jié)果就是一個(gè)json文本,然后固執(zhí)地以json的形式去解析描姚,這樣顯然沒(méi)辦法把一個(gè)網(wǎng)頁(yè)解析成一個(gè)字典或者數(shù)組涩赢,所以產(chǎn)生了上述錯(cuò)誤。

解決辦法很簡(jiǎn)答轩勘,在代碼中添加一句:

manager.responseSerializer = [AFHTTPResponseSerializer serializer]

告訴AFNetworking別把這個(gè)網(wǎng)頁(yè)當(dāng)成JSON數(shù)據(jù)來(lái)解析筒扒!于是修改代碼如下:

- (void)viewDidLoad {
    [super viewDidLoad];
    // 將上次實(shí)驗(yàn)的URL注釋掉
    // NSString *urlString = @"http://api.jirengu.com/weather.php";
    // NSString *urlString = @"http://itunes.apple.com/search?term=metallica";
    // 使用baidu的HTTPS鏈接
    NSString *urlString = @"https://www.baidu.com";
    NSURL *url = [NSURL URLWithString:urlString];
    
    AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];

    manager.responseSerializer = [AFHTTPResponseSerializer serializer]

    [manager GET:url.absoluteString parameters:nil progress:nil success:^(NSURLSessionDataTask *task, id responseObject) {
        
        NSLog(@"results: %@", responseObject);
        
    } failure:^(NSURLSessionDataTask *task, NSError *error) {
        
        NSLog(@"results: %@", error);
        
    }];

}

運(yùn)行項(xiàng)目,得到輸出如下:

2016-10-08 20:00:18.052 HTTPS[1916:359510] results: <3c21444f 43545950 45206874 6d6c3e0a 3c68746d 6c3e0a20 2020203c 212d2d53 54415455 53204f4b 2d2d3e0a 20202020 3c686561 643e0a20 20202020 2020203c  ...... 6c3e0a>
Message from debugger: Terminated due to signal 15

顯然绊寻,這次成功地獲取到了數(shù)據(jù)花墩。將HTTPS鏈接換為知乎的URL,得到的結(jié)果類(lèi)似澄步。

由此可知冰蘑,對(duì)于符合ATS要求的HTTPS服務(wù)器,在iOS端不需要對(duì)ATS做特殊的適配就能和HTTPS服務(wù)器進(jìn)行通信村缸。而要符合ATS要求祠肥,則需要老老實(shí)實(shí)地創(chuàng)建證書(shū)請(qǐng)求,然后到權(quán)威機(jī)構(gòu)認(rèn)證王凑,隨之配置到服務(wù)器搪柑。

小結(jié):在本篇功課中,對(duì)HTTPS通信的原理和機(jī)制有了一定了解索烹,實(shí)現(xiàn)了利用AFNetworking庫(kù)向符合ATS要求的HTTPS服務(wù)器的通信工碾。

參考:https://zhuanlan.zhihu.com/p/22749689

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市百姓,隨后出現(xiàn)的幾起案子渊额,更是在濱河造成了極大的恐慌,老刑警劉巖垒拢,帶你破解...
    沈念sama閱讀 216,402評(píng)論 6 499
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件旬迹,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡求类,警方通過(guò)查閱死者的電腦和手機(jī)奔垦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,377評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén),熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)尸疆,“玉大人椿猎,你說(shuō)我怎么就攤上這事惶岭。” “怎么了犯眠?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,483評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵按灶,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我筐咧,道長(zhǎng)鸯旁,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,165評(píng)論 1 292
  • 正文 為了忘掉前任量蕊,我火速辦了婚禮铺罢,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘残炮。我一直安慰自己畏铆,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,176評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布吉殃。 她就那樣靜靜地躺著,像睡著了一般楷怒。 火紅的嫁衣襯著肌膚如雪蛋勺。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,146評(píng)論 1 297
  • 那天鸠删,我揣著相機(jī)與錄音抱完,去河邊找鬼。 笑死刃泡,一個(gè)胖子當(dāng)著我的面吹牛巧娱,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播烘贴,決...
    沈念sama閱讀 40,032評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼禁添,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了桨踪?” 一聲冷哼從身側(cè)響起老翘,我...
    開(kāi)封第一講書(shū)人閱讀 38,896評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎锻离,沒(méi)想到半個(gè)月后铺峭,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,311評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡汽纠,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,536評(píng)論 2 332
  • 正文 我和宋清朗相戀三年卫键,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片虱朵。...
    茶點(diǎn)故事閱讀 39,696評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡莉炉,死狀恐怖钓账,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情呢袱,我是刑警寧澤杈曲,帶...
    沈念sama閱讀 35,413評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站绣张,受9級(jí)特大地震影響狂秦,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜治专,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,008評(píng)論 3 325
  • 文/蒙蒙 一卖陵、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧张峰,春花似錦泪蔫、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至饶深,卻和暖如春餐曹,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背敌厘。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,815評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工台猴, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人俱两。 一個(gè)月前我還...
    沈念sama閱讀 47,698評(píng)論 2 368
  • 正文 我出身青樓饱狂,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親宪彩。 傳聞我的和親對(duì)象是個(gè)殘疾皇子休讳,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,592評(píng)論 2 353

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