PDF中的数字签名(Digital Signatures in a PDF)翻译

pdf文档下载链接: https://www.adobe.com/devnet-docs/etk_deprecated/tools/DigSig/Acrobat_DigitalSignatures_in_PDF.pdf

PDF中的数字签名(Digital Signatures in a PDF)

本文档描述了在PDF文档中如何表示数字签名,以及PDF语言支持哪些与签名相关的特性。Adobe-Reader和Acrobat实现了PDF s的所有功能,因此为基于公钥基础设施(PKI)技术的数字数据身份验证提供了全面的支持。第三方开发人员可以以Acrobat插件签名处理程序的形式定义他们自己的机制。

数字签名可用于过去使用传统钢笔和墨水签名的许多类型的文档。然而,仅仅存在数字签名并不能充分保证文档就是它看起来的样子。此外,政府和企业设置经常需要对其签名工作流施加额外的约束,例如在签名期间和之后限制用户的选择和文档行为。

由于这些原因,PDF语言为两大类任务提供了以下机制:

  • 通过验证签署的文件没有被更改,而且是由收件人信任的人签署的,完全信任电子文件。
  • 创建和控制功能丰富且安全的数字签名工作流。

不论PDF查看应用程序如何,PDF语言都支持以下功能:

  1. 标准支持(Standards support )
  2. 支持替代签名方法(Support for alternate signature methodologies )
  3. 支持两种签名类型(Support for two signature types )
  4. 签名互操作性(Signature interoperability)
  5. 强大的算法支持(Robust algorithm support)
  6. 多重签名(Multiple signatures )
  7. 增量更新(Incremental updates )
  8. 查看以前签名的文档版本(Viewing previously signed document versions )
  9. 比较当前和已签名的文档版本(Comparing current and signed document versions)
  10. 锁定表单字段 ( Locking form fields)
  11. 控制签名后更改 ( Controlling post-signing changes )
  12. 法律内容证明 ( Legal content attestations )
  13. 通过基于文档的权限启用功能 ( Enabling features via document-based permissions )
  14. 丰富的证书处理 ( Rich certificate processing)
  15. 通过种子值控制签名工作流 ( Controlling signature workflows via seed values)

6.1 签名在pdf中如何呈现 (Representing a signature in a PDF file)

pdf中的签名是包含在一个签名字典里的。字典里的对象由pdf Reference所定义。这个签名字典能引用其他字典或者被其他字典引用,如图1所示。(Figure 1 PDF language dictionaries)这些词典中的条目确定了签名的性质和特征,并通过扩展确定了用于处理签名数据的任何PDF查看器可以使用哪些数据。


图1.jpg

图1 中 TransfomMethod sets what TransformParams are used.应该是"转换方法转成所需要的参数"
字典有: 权限字典,字段字典,字段锁字典,种子值字典,签名字典(签名处理器,签名格式,文件范围,PKCS签名值,其他),签名引用字典,证书SV字典
转换方法有: FieldMDP(Field level permissions 字段级权限),DocMDP(证书签名),UR3(各种权限)
The entries in these dictionaries determine the nature and features of the signature, and by extension, what data can be available to any PDF viewer designed to process the signature data.
这些词典中的条目确定了签名的性质和特征。并且这些词典通过扩展确定了用于处理签名的PDF查看器可以使用的那些数据。

虽然其他查看器对PDF语言特性的支持可能各不相同,但Acrobat系列产品支持所有这些特性。在较高的层次上,这些特性可以分为以下几个类别:

  1. 向文档添加数字签名。
  2. 检查签名的有效性
  3. 控制签名工作流的权限和限制。
    当然,PDF包含与这些活动相关但对它们不是必需的特性。例如,支持添加签名原因与签名无关,但对许多工作流都很有价值。

6.2 公钥基础设施(Public key infrastructure)

PDF的数字签名功能是为与企业和政府环境中部署的主流公钥基础设施(PKI)相关的所有标准兼容而设计的。PKI是用于创建、分发、管理和撤销以及使用数字id(包含在签署PDF时使用的公钥/私钥对)的人员、策略、过程、硬件和软件的集合。

public key infrastructures (PKI) 公钥基础设施

在PDF签名工作流中,PKI一般是指数字ID发行方、用户、管理员以及这些工作流中使用的任何硬件或软件。实现并遵守PDF语言规范的PDF查看器能够以无缝且健壮的方式与所有这些组件交互。

图2.jpg

图2 在签名工作流里的常见PKI元素

企业PKI元素(Enterprise-owned PKI elements): 私钥备份存储,撤销数据存储(revocation data store: Local certificate revocation lists (CRL 证书撤销列表),LDAP CRL,online status check. etc ),公钥证书存储( acrobat store, Windows cert. sotre,LDAP store, etc.)

公司或者三方时间戳服务器(Company or third party timestamp server):

根证书: CA自签名(Root cert: CA self signed) :(1. 过渡证书 (intermediate certificate)) (Often the company issues ID to employees. Can define policies, trust anchor, etc. )公司通常会向员工发放身份证。可以定义策略、信任锚等。 (2. 数字id/最终实体证书 digital id/end entity cert)存储在签名者机器、令牌、服务器等上的数字ID。 Digital ID stored on the signer's machine, token, server, etc.

猜测:大概是根证书给企业过渡证书,然后企业通过过渡证书使用相关工具生成用户的证书。

在签署一份重要的纸质文件时,人们通常在提供了令人满意的身份证明后,当着公证人或其他可信赖的权威机构的面签字。因为公证人是值得信赖的,所以你可以信任公证人的签名。使用PKI是一种提供类似信任的方法。

与提供信任直接相关的一些常见PKI组件(Some common PKI components directly related to providing trust include:):

  1. 证书颁发机构(Certificate authority (CA)):出售或发布数字id(如Verisign或Geotrust)的最终信任权威。CA签署它自己的证书(自签名),它的证书通常是证书链顶部的“根”证书。

  2. 过渡证书/中间证书(Intermediate certificates (ICAs)):一种CA的类型,其证书位于最终实体和根证书之间的证书链中。证书不是自签名的,ICA经常提供诸如策略、时间戳、撤销列表等服务。

  3. 最终实体证书(End entity certificate (EE))签名者的证书和签名链的最后一个元素。根据定义,最终实体证书不包含基本约束值CA。

  4. 数字ID(Digital ID):一种基于ITU-TX.509 v3标准的电子数据证明,与个人或实体相关联。它存储在电脑或网络上有密码保护的文件、USB令牌、智能卡等。数字ID包含公钥证书、私钥和其他数据。

  5. 公钥证书(Public key certificate):一个文件,其中包含公钥/私钥对的数字公钥部分,以及用于定义证书所有者、有效期和用法的相关扩展名和属性。

  6. 私钥(Private key):PKI系统中的一种私密密钥,用于验证传入的消息和对传出的消息签名。在这些密钥生成期间,私钥总是与它的公钥配对。

虽然数字ID及其发行实体是任何PKI的核心,PKI还包括许多其他企业拥有和第三方项目。PKI管理员通常会管理数字id、LDAP服务器、时间戳服务器、撤销列表和其他条目的创建和分发。PDF语言支持与这些组件接口所需的所有数据。

6.2.1 PKI, PDF, and signing(公钥基础设置,pdf[The Portable Document Format (PDF) 便携式文件格式 ]和签名)

PDF支持将签名嵌入到文档本身,而不是作为单独的数据管理或添加到现有的文档格式中。这意味着查看应用程序可以执行某些类型的修改,而不会使签名失效。对于其他数字签名格式,用户可能需要两个应用程序来同时处理文档和签名,或者需要为每个签名文档管理两个独立的文件。

PDF文档中的每个数字签名都与签名处理程序相关联。签名被放置在PDF签名字典中,其中包含将用于处理该签名的签名处理程序的名称(图3)。内置在adobeacrobat中的签名处理程序利用了公共/私有密钥(PPK)加密技术。PPK基于这样一种思想:使用私钥加密的值只能使用公钥解密(相反的情况也可能发生在为特定接收者加密文档时,但这不在本文档的范围之内)。

在签署PDF时,签名者的证书被嵌入到PDF文件中。图3显示了存储在用户硬件设备上的数字ID与嵌入在PDF文档中的签名值之间的关系。签名值还可以包括其他信息,如签名图形、时间戳和其他特定于用户、系统或应用程序的数据。

图3.jpg

签名流程如下:

  1. 要签名的文档被转换为字节流。
  2. 将整个PDF文件写入磁盘,并为签名值留下合适大小的空间,同时在ByteRange这个字段中保留最坏情况下的值。

ByteRange 是一个由四个数字组成的数组。每对中的第一个数字是要包含在散列中的字节流的开始在文件中的偏移量(从开始,从0开始)。第二个数字是该流的长度。这两对定义了定义要散列的内容的两个字节序列。实际的签名值存储在第一个序列结束和第二个序列开始之间的/Contents键中。在图4中,哈希是为0到839字节和960到1200字节计算的。(其实说了这么一段,看图最简单)

图4.jpg
  1. 一旦根据文件中的偏移量知道了签名值的位置,就会使用正确的值覆盖ByteRange数组。因为字节偏移量不能更改,所以新array语句后面的额外字节将被零覆盖。

  2. 整个文件的哈希是通过使用SHA-256之类的哈希算法,使用由实际字节数值指定的字节计算的。
    Acrobat总是计算整个PDF文件上的文档签名的散列,从字节0开始,到物理文件中的最后一个字节结束,但不包括签名值字节。

  3. 哈希值使用签名者的私钥加密,并生成十六进制编码的PKCS#7对象签名对象。

  4. 签名对象放在磁盘上的文件中,覆盖占位符/内容值。任何未用于签名对象的空间都将被零覆盖。

  5. 在Acrobat中重新加载PDF文件,以确保内存中的版本和磁盘上的版本相同。

提示:这是一个高层视图。有关显示一些应用程序级配置选项的更详细的快速键,请参阅签名创建工作流(6.4 Signature creation workflow)。

6.2.2 PKI, PDF and signature validation(签名验证)

由于私钥和公钥都只是数字,所以任何人都可以使用任意数量的工具生成公钥和私钥对。Acrobat等应用程式提供一种机制,以生成自签署证书,将简单的用户提供的身分与由应用程式生成的公钥绑定;然后使用对应的私钥对其进行签名。显然,没有什么可以阻止某人用别人的名字生成自签名证书。因此,未知的自签名证书没有高级的保证。

为了解决这种类型的信任问题,组织使用PKI,其中包括一个发布、记录和跟踪数字id的独立权威机构。因为PDF支持嵌入签署人的公钥作为签名的一部分,所以文档接收者总是使用它进行签名验证。要验证签名,验证器只需检索签名者的证书,并将其与自己的可信证书列表进行比较:

  1. 接收方应用程序使用签名者使用的相同算法生成文档的单向散列(不包括签名值)。

  2. 文档中加密的哈希值使用签名者的公钥解密。

  3. 解密后的哈希值与本地生成的哈希值进行比较。

  4. 如果它们是相同的,则将签名报告为已知的。

提示:签名是否可信或有效是单独的问题。签名信任取决于收件人的应用程序配置。签名状态还取决于文档完整性检查。

6.3 PDF语言签名特性(PDF language signature features)

6.3.1 标准支持(Standards support)

PDF本身就是一个开放的ISO标准。ISO 32000中对PDF中的数字签名支持进行了全面描述,Adobe在其open SDK中提供了与PDF和Acrobat系列产品api交互的工具。但是,PDF还内置了对其他标准的支持,像Acrobat和adobereader这样的PDF查看器应该遵循表2中列出的公认标准。

6.3.2 支持替代签名方法(Support for alternate signature methodologies)

大多数签名都是纯数学的,比如由Acrobat缺省签名处理程序生成的公钥/私钥加密文档摘要。然而,它们也可能是一种生物识别形式,如手写签名、指纹或视网膜扫描。签名处理程序根据PDF ISO标准中定义的规则处理数据并控制身份验证的形式。

6.3.3 支持两种签名类型(Support for two signature types)

PDF定义了两种签名类型:批准(approval)和认证(certification)。这两种类型都是所有文件内容上的字节范围签名。两者都在文档被签名时获取文档的可视快照,从而提供较高级别的文档完整性。

差异如下:

  • 批准:文件中可以有任意数量的批准签名。该字段可以选择与FieldMDP权限相关联。参见锁定表单字段(6.3.10 Locking form fields)。
  • 认证:只能有一个认证签名,并且必须是文档中的第一个。该字段始终与DocMDP(请参阅控制签名后的更改 6.3.11 Controlling post-signing changes)和合法内容认证相关联(6.3.12 Legal content attestations)。它们可以选择与FieldMDP权限相关联。

6.3.4 签名的互操作性(Signature interoperability)

PDF被设计成允许签名处理程序和符合规范的阅读器之间的互操作性;也就是说,使用处理程序ABC签名的PDF应该能够使用来自不同供应商的处理程序XYZ进行验证。

当存在时,签名字典中的子过滤器条目指定签名值和密钥信息的编码,而过滤器条目指定应该用于验证签名的首选处理程序。子过滤器条目有几个已定义的值,都基于RSA Security发布的公钥加密标准,也是Internet Engineering Task Force (IETF)公钥基础设施(PKIX)工作组发布的标准的一部分。

6.3.5 健壮的算法支持(Robust algorithm support)

随着安全问题的发展,PDF扩展了对越来越强大的加密算法的支持,如下所示。可以通过种子值或在应用程序首选项级别(如注册表)指定摘要算法。


表1-算法支持.jpg

表1-算法支持中的说明:
(a)尽管在这个子过滤器值的名称中出现了sha1,支持的编码并不局限于sha1。PKCS#1对象有一个标识符,指示使用哪种算法。
(b)可使用其他算法来摘要带符号的数据字段;但是,SHA1用于摘要已签名的数据。

6.3.6 多个签名(Multiple signatures)

有些文件可能需要多个签名。在纸上再画一条线很容易处理。在纸的世界里,签署文件的人最好在文件被签署时保存一份副本。然后,如果另一个人更改了文档,签名者可以很容易地辩称文档已被更改。

但是,对于PDF,任何通过修改文件来修改文档的尝试(比如再次对其签名)都将使现有的数字签名无效。这是因为验证时计算的哈希值与签名时创建的加密哈希值不匹配。

PDF通过支持增量更新的能力解决了这个问题(请参阅增量更新)。只要其他权限限制(例如DocMDP和FieldMDP)不阻止附加签名,签署人就可以在文档中添加另一个签名字段并对其进行签名,而不会使之前的签名失效。

6.3.7 增量更新(Incremental updates)

PDF文件格式定义了增量更新功能。增量更新对查看文档的人来说是透明的,但是允许检测和审计对文件的修改。通常PDF语言的这个特性,特别是已签名的PDF文件的这个特性,允许通过在增量更新部分的文件末尾添加修改信息来修改任何PDF文件。不需要对表示文件早期版本的字节进行任何更改。这允许将附加的签名添加到PDF文件中,而无需修改以前的签名所涵盖的任何数据。

每个附加签名将覆盖整个PDF文件,从第0字节到最后一个字节,只排除当前签名值的签名值。图5显示了如何为具有三个签名的文件创建签名。

图5-多签名和增量更新.png

6.3.8 查看以前签署的文档版本(Viewing previously signed document versions)

PDF语言的增量更新功能(6.3.7 Incremental updates)允许PDF查看器有效地保留任何PDF文件的所有签名版本。这使得用户可以实际看到已签名的PDF文件的版本。

Acrobat提供了两个功能,充分利用了PDF在签名时记住文档状态的能力:

  • 查看签名版本:通过右键单击签名并选择查看签名版本,显示文档在应用签名时的存在状态。可以通过删除PDF文件中与签名对应的EOF之后的任何字节来手动模拟它。
  • 比较签名版本与当前版本:通过右键单击签名并选择比较签名版本与当前版本,来比较文档的当前版本与已签名版本。

6.3.9比较当前文档版本和已签署文档版

参见查看以前签署的文档版本(6.3.8 Viewing previously signed document versions)。

6.3.10锁定表单字段(Locking form fields)

表单字段包括签名字段和非签名字段,表单通常包含许多表单字段,一些用于签名,另一些用于表单数据。PDF语言允许作者控制在文档签名后是否可以填充其他字段,可以通过签名或输入任何类型的数据。创建文档时,作者可以指定以下内容:

  • 如果表单填写了,是否会导致批准(approval)或签名无效?
  • 在特定收件人签署文件后,对特定表单字段的任何修改将使该收件人的签名无效。在这种情况下,为每个收件人指定一个单独的签名字段。

使用FieldMDP转换方法检测文档表单字段值的更改(如图1)。

6.3.11 控制签约后的变更(Controlling post-signing changes)

PDF提供了一种限制后签名的机制。该机制就是DocMDP转换方法(修改检测和预防的简写)。DocMDP转换参数字典中的P条目指示了对文档的下列哪些更改将使签名无效(图1):

  • 没有修改
  • 填写表格及数字签名
  • 注释(注释)、表格填写、数字签名

文档只能包含一个包含DocMDP转换方法的签名字段,并且它必须是文档中的第一个签名字段。该签名称为认证签名。这个特性使作者能够指定哪些更改是允许的,哪些更改会使作者的签名无效。但是,大多数用户会认为DocMDP的作用是指定他们可以对文档做什么。

一个认证签名应该有一个合法的认证字典,它指定了所有可能导致文档内容意外呈现的内容,以及作者对这些内容的认证。如果文档的完整性受到质疑,本词典可以用来确定作者的意图。

Acrobat允许第一个签署人使用认证签名对文档进行认证,并在签名期间动态地设置权限和合法证明。

当一个认证的文档被打开时,签名会像往常一样被验证,除了文档被打开并与当前正在查看的内存中的文档(包括所有增量更改)进行比较之外。进行了修改分析,并报告了作者禁止的修改。违反权限会导致无效签名。

6.3.12 法律内容认证(Legal content attestations)

考虑到其内在的丰富性,PDF语言提供了许多可能导致PDF文档呈现形式变化的功能(例如多媒体或JavaScript)。这些功能可用于构造有意或无意地误导文档接收者的文档。当考虑签署PDF文件的法律影响时,这些情况是相关的。

为了促进文件信任,符合标准的认证签名作者(如Acrobat)也应该利用PDF的法律认证字典。字典项指定可能导致意外呈现文档内容的所有内容。此外,作者可以通过认证条目的方式进一步澄清此类内容。审阅者应该自己确定他们信任作者和文档内容。

6.3.13 通过基于文档的权限启用功能(Enabling features via document-based permissions)

PDF允许具有丰富PDF交互的全功能客户机向功能较差的客户机授予特定于文档的权限,以便它们也可以使用其中一些特性。使用这种机制,不具备数字签名能力的客户端可以被授予该能力。当在语言级别为特定文档授予权限时,任何与签名相关的用户界面元素都将被启用。

例如,使用Acrobat的作者可以授权使用公钥加密启用Adobe-Reader中的其他特性。它使用证书颁发机构向与它建立业务关系的文档创建者颁发公钥证书。adobereader验证启用权限的签名使用来自Adobe授权的证书颁发机构的证书。因此,打开已启用Reader的文档的adobereader用户可以签名、填写表单字段,以及执行否则将被禁止的操作。

这种机制称为使用权签名,通常对最终用户是透明的。使用权签名引用自权限字典中的UR3条目(图1)。该签名可启用在符合标准的阅读器中默认不可用的额外交互特性,并验证权限是否已由真正的授权机构授予。转换参数字典指定签名有效时应启用的附加权限。如果签名因任何原因无效,则不授予其他权利。

6.3.14 丰富的证书处理(Rich certificate processing)

PDF支持特性丰富的证书处理和处理,因为它证书数据嵌入到签名中。可以将PDF查看器和签名处理程序设计为根据需要使用这些数据。例如,当使用PKCS#7签名时,签名对象可以包含以下部分或全部内容:

  • 时间戳信息
  • 嵌入式撤销信息
  • CRLs和OCSP的撤销检查细节
  • 证书政策和属性证书(Certificate polices and attribute certificates)

6.3.15 通过种子值控制签名工作流(Controlling signature workflows via seed values)

PDF对种子值的支持为作者提供了在文档被路由到签名者后对其行为的字段级控制。种子值指定属性和属性值,作者可以控制指定的参数对于任何特定字段是可选的还是必需的。

例如,在签名特定的签名字段时,您可以使用种子值来限制用户的选择,例如要求使用由特定CA颁发的证书进行签名。

如果字段字典包含引用种子值字典的SV条目,则在对字段进行签名时使用该字典。Ff条目规定词典中的其他条目是否受到尊重,或者它们是否仅仅是推荐。Acrobat默认处理程序支持由PDF标准定义的所有种子值。Acrobat提供了用于种子字段的api。

图6-种子值字典.png

6.4 签名创建流程(Signature creation workflow)

签名创建流程图.jpg

表中的一些英文的翻译
工作流可以通过GUI和注册表设置进行配置。(The workflow is configurable through the GUI and registry settings.)

支持第三方处理程序。 (Supports third party handlers.)

用UI或编程方式创建签名外观。内容由包含在表单字段中的SigAP字典定义。 (Create signature appearances with the UI or programmatically. Contens are defined by the SigAP dictionary included in the form field.)

签名外观包含在消息摘要中。 (The signature appearance is included in the message digest.)

DSA/RSA算法由签名者在P12/PFX文件、智能卡/令牌、漫游ID服务器、Mac密钥链或Windows sotre中的数字ID私钥指定。(The DSA/RSA algorithm is specified by the signer's digital ID private key in a P12/PFX file, smart card/token, roaming ID server, Mac Key Chain, or Windows sotre.)

如果没有时间戳或时间戳失败,使用本地时间。(if not time stamped or time stamping fails, use the local time.)

签名对象构建在内存中,直到检索到所有撤销检查、时间戳和证书数据。(The signature object is built in memory until all the revocation checking, timestamp, and certificate data is retrieved.)

签名对象使用专有编码规则(Distinguished Encoding Rules, DER)进行编码。DER对象是十六进制编码,并用零填充,以使有符号字节范围与开始签名过程时留出的大小相匹配。 (The signature object is encoded using the Distinguished Encoding Rules (DER). The DER object is hex encoded and padded with zeros to make the signed byte range match the size that was set aside when the signing process began.)

字典内容可以通过UI和注册表设置(如cReasons、cContactInfo等)进行定制。(Dictionary contents are customizable through UI and registry setttings such as cReasons, cContactInfo, etc.)

参考文献(References)

  1. PDF的引用(PDF References)
  2. 数字签名构建字典规范(Digital Signature Build Dictionary Specification)
  3. Acrobat的数字签名(Digital Signature Acrobat)
  4. 数字签名的外观(在SDK中)(Digital Signature Appearances (in the SDK))

6.5 支持的标准( Supported standards)

表2.png

表2 标准支持(引用和引用的大概内容)

6.5 额外的资源( Additional resources)

关于数字签名、PDF和Acrobat系列产品的更多信息存在于http://learn.adobe.com/wiki/display/security/document+ library的安全特性库中。

特别是:

  • Acrobat中的数字签名:描述Acrobat系列产品如何使用PDF的数字签名功能的实现细节。
  • Acrobat和adobereader中的数字签名和权限管理:配置、使用和管理员感兴趣的技术细节。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,772评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,458评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,610评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,640评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,657评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,590评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,962评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,631评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,870评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,611评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,704评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,386评论 4 319
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,969评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,944评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,179评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,742评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,440评论 2 342

推荐阅读更多精彩内容