前言

你是一名软件开发者吗?日常工作中是否有时需要使用密码学,例如哈希、加密或数字签名?你是否认为密码学复杂、充满数学,只适合少数技术高手?其实并非如此。每位开发者都能学会如何使用密码算法。本书将通过代码示例和动手编程体验,用更少的数学和更多的实践告诉你该怎么做。

从开发者的视角理解密码学概念,你不必是一名优秀的数学家,甚至无需擅长数学。本书将以几乎不涉及数学的方式,循序渐进地讲授应用密码学基础,并提供大量代码示例实践练习,让你获得动手经验,就像学习 Web 开发、数据库或移动应用一样。没错,如果你能学会 Web 开发或 RESTful 服务,同样也能掌握密码学的实践部分。这个过程就像学习一个新的 API 或 Web 开发框架:你需要掌握概念API(密码学库实现的密码算法)、工具,以及正确使用这些 API 和工具的最佳实践

通过本书,你将学习如何使用密码算法和密码系统,包括哈希、MAC 和密钥派生函数(KDF)、随机数生成器、密钥交换协议、对称密码、加密方案、非对称密码系统、公钥密码学、椭圆曲线、数字签名和抗量子密码算法,以及现代密码学工具和库。

我很高兴能够免费出版这本对开发者友好的实用密码学图书。它只包含开发者为了在日常工作中使用密码学而必须了解的内容。本书不讨论算法内部原理,也不讲解如何设计对称密码、公钥密码系统或认证方案;它从开发者视角介绍对核心密码学概念的基本理解及其使用方法,包括工具代码示例。这就是大多数开发者需要了解的密码学知识,也是本书免费提供给你的内容。

本书面向开发者

本书专为每天编写代码的开发者而设计,也面向构建软件系统、Web 应用、移动应用和其他软件的软件工程师。它同样适合处理密码算法并编写代码自动化 IT 基础设施的 DevOps 工程师;希望深入学习实用密码学的系统管理员;每天都要接触密码学,需要判断哪些密码和算法安全、哪些已经被攻破,并了解潜在攻击的信息安全工程师;负责安全测试以及安全与密码学代码审查的资深 QA 工程师;以及许多其他 IT 专业人员

本书讲的是如何使用密码算法和密码学软件包,而不是如何设计密码、签名方案或密码系统。你将了解密码系统的工作方式(不会涉及太多数学),以及如何在日常工作中使用它们。本书并非完全没有数学,但复杂度已降低到适合普通开发者的程度,并以简化、易懂的方式解释复杂概念。本书由开发者为开发者编写,而不是由大学教授或数学家编写。它主张在理解概念的基础上聪明地编写代码,并以正确的方式使用密码算法和密码学库。本书介绍截至 2018 年 11 月软件行业实际使用的现代密码算法和密码学技术。

我们假设大多数开发者使用 JavaScript、Python、C#、Java 和 PHP 等高级编程语言,因此本书大多数代码示例采用 Python,并且很容易迁移到其他语言。

本书免费开放

本书主要作者 Svetlin Nakov 博士采用 MIT 许可证,将本书的全部内容和代码示例作为开源项目免费捐赠给开发者与 IT 社区。为什么?因为作者和项目背后的参与者相信,知识属于每个人,应当免费共享;因为开发者应当学会以正确的方式使用密码学;因为我们的世界需要更安全的软件;也因为免费分享知识和技能是现代教育最伟大的奇迹。

正是这些理念促使人们创建 Wikipedia 并免费分享知识,在 GitHub 上发布开源项目并免费分享代码,开发 GNU/LinuxFirefox 等开源软件并免费分发。我也出于同样的原因,为开发者编写并发布这本开源密码学图书。我希望分享知识和技能,帮助开发者成为更出色的专业人士。作为一名开发者,我在学习新技术时也会在互联网上寻找免费资源和代码示例,并为有人愿意免费创作和分享这些内容而高兴。现在,该是我回馈社会和开发者社区的时候了,这让我感到快乐。

关于作者:Svetlin Nakov 博士

Svetlin Nakov 博士(http://www.nakov.com)来自保加利亚,是一名充满热情的软件工程师、富有感染力的技术培训师和科技创业者,在多种语言、软件技术和平台方面拥有丰富经验。他共同创立了多家非常成功的科技初创企业和非营利组织,并担任多个成功的区块链 ICO 项目技术顾问。Svetlin 是SoftUni 的培训、创新与启发经理;SoftUni 是东南欧最大的技术教育机构。

Svetlin Nakov 拥有 20 多年的技术背景,曾担任软件工程师、软件项目经理、顾问、培训师创业者,在 .NET、Java EE、信息系统、数据库、密码学与软件安全、Web 开发、JavaScript、PHP、Python 和软件工程等领域经验丰富。他是 15 本计算机编程、软件技术、密码学、C#、Java、JavaScript 和 Python 图书的主要作者,还发表了数十篇技术与学术论文。他非常热衷于知识共享,并为自己是 Wikipedia 贡献者、免费图书作者和开源支持者而自豪。

Svetlin 曾在美国、新加坡、德国、埃及、保加利亚等地数百场会议、研讨会、技术聚会、课程和其他培训活动中担任演讲者。他拥有计算机科学博士学位,研究方向为计算语言学和机器学习;曾在国际信息学奥林匹克竞赛(IOI)中多次获得奖牌,并获得保加利亚总统“John Atanasoff”奖。他还曾在索非亚大学、新保加利亚大学、索非亚技术大学、新加坡义安理工学院、美国 Kingsland University 等机构担任兼职助理教授或培训师。

目前,Svetlin Nakov 与合作伙伴正在推动保加利亚及周边地区最大的软件工程师培训中心——Software University——走向全球。在那里,他启发并教授数十万年轻人计算机科学、软件开发、信息技术和数字技能,帮助他们获得专业技能和工作机会。

本书背后的故事

2004 至 2018 年间,Svetlin Nakov 与数十位合著者以开源项目形式创作并发布了数十本技术图书,主题涉及计算机编程和软件技术(参见 http://www.introprogramming.infohttp://www.nakov.com/books),其中大多数以保加利亚语写成。近几年,Svetlin 转而使用英语,并发起面向全球的知识共享倡议,致力于提供更优质、更普及的技术教育;具体行动包括创作并分享免费技术图书、免费教程、免费技术网络研讨会和讲座、会议演讲等。

本书作者 Svetlin Nakov 自 2005 年起涉足应用密码学。当时,他在完成相近主题的硕士论文后,以保加利亚语出版了《使用 Java 为 Web 文档添加数字签名》。此后,Nakov 在软件工程师、技术培训师和创业者的实践中持续接触密码学软件安全区块链系统,技术专长也随经验不断增长。2018 年,他决定编写一本免费图书,从开发者视角分享密码学和密码算法知识,并将这些知识捐赠给全球开发者社区。本书历时三个月写成,于 2018 年 11 月出版。你可以从这里免费获取:https://cryptobook.nakov.com

Software University(SoftUni)

本书的编写得到了 Software University(SoftUni) 的支持。它是东南欧规模最大、声誉卓著的软件工程和数字技能培训中心,为数万名年轻人提供高质量技术教育、实践技能、专业方向和工作机会。

SoftUni 通过 Software University 项目培养软件工程师,通过 SoftUni Creative 项目教授创意与设计,通过 SoftUni Digital 项目教授数字营销,通过 SoftUni Kids 项目向儿童教授编程和技术技能;它还运营数字技能高中 SoftUni Svetlina,并通过 SoftUni Foundation 及其技术教育门户 SoftUni Free 分享知识和技能。

为什么还要再写一本密码学图书?

市面上的大多数密码学图书要么采用过于学术化的风格,充斥理论和数学;要么已经过时,没有介绍当今实际使用的密码学;要么篇幅太短、内容薄弱且没有写完。其他一些图书质量更好,却并非免费,无法供所有人使用。

开发者实用密码学》试图弥补市面上现有密码学图书的上述不足:它免费对开发者友好内容全面,以更少的数学和更多的代码示例进行讲解。

学术密码学图书

市面上有许多高质量的学术密码学图书,其中一些也免费,但我无法向开发者推荐这类图书。开发者往往读过一两章后就会感到无聊,甚至开始讨厌密码学。下面是一些例子:

  • 《应用密码学研究生课程》(Dan Boneh 与 Victor Shoup 著)是密码学概念领域最出色的学术著作之一。这是一本优秀、免费理论密码学图书,但并非为开发者编写。全书充满理论、概念、数学和公式,没有提供代码示例,也没有推荐开发者使用的库。内容较新,出版于 2017 年。
  • 《Crypto 101》 是一本免费的密码学图书,对开发者而言更容易理解。它以更简单的方式解释核心密码学概念,但没有提供代码示例,也未推荐相应的库和工具。内容较新,出版于 2017 年。
  • 《应用密码学手册》(Alfred J. Menezes、Paul C. van Oorschot 与 Scott A. Vanstone 著)非常适合高年级学生,但对开发者而言过于学术化。它可以免费获取,以大量高等数学很好地解释了理论与密码学概念,但确实不适合开发者。书中没有可运行的代码示例,也没有介绍软件行业最常用的密码学库。内容略显过时,出版于 2001 年。
  • 《理解密码学:面向学生与从业者的教材》(Christof Paar、Bart Preneel 与 Jan Pelzl 著)是另一本优秀的学术密码学图书。它对密码学概念的组织很好,并以伪代码描述算法,但不适合开发者,也没有提供代码示例或推荐开发者使用的库。内容基本没有过时,出版于 2010 年,不免费。
  • 《实用密码学》(Niels Ferguson 与 Bruce Schneier 著,2003 年)是另一本讲解密码学概念的学术著作。它深入解释常用密码算法,并附有伪代码。内容略显过时,出版于 2003 年。

密码学库及其文档

一些密码学库会尝试提供包含密码学概念和代码示例的文档,但这些文档通常范围有限,有时没有完成,组织方式也不总是一致,并且缺少许多内容。它们可以帮助你使用某个特定的库,但并不是学习密码学概念的最佳来源。

尽管如此,对于希望使用密码算法的开发者,特别是已经具备密码学知识和技能的资深工程师,这些文档和手册仍然是最好的免费学习资源之一。以下是一些随密码学库提供的优质算法文档:

  • Nettle 文档——对常见密码学概念和算法(哈希、MAC、对称密码、签名)有很好的描述,并提供可靠、高效的 C 实现。
  • PyCA / Cryptography 文档——对许多密码学原语(如哈希、MAC、对称加密、认证加密、非对称算法、密钥交换、KDF 等)做了基础介绍,并提供 Python 代码示例,演示如何使用 pyca/cryptography 库的 API 和密码算法。
  • Libsodium 文档——将 API 文档与密码学概念结合起来,面向 Libsodium 项目使用的 C 语言,并提供示例代码。
  • Crypto++ Wiki——简要解释一些密码学概念,并说明如何使用 Crypto++ 库和实现特定密码算法的 C++ 类,同时提供示例代码。
  • Botan 开发者手册——Botan 是一个现代 C++ 密码学库,实现了许多现代密码算法;其文档还会简要说明底层密码学概念。
  • Libgcrypt 手册——Libgcrypt 是 GnuPG 项目的一部分,用 C 编写。它仅对密码学概念做了非常简单的介绍,API 文档也较为枯燥,几乎没有示例代码。

现有的实用密码学图书

坦率地说,为了找到最适合开发者的密码学图书,我在 2018 年 11 月对图书市场进行了一次全面调研,结果却令我深感失望。我几乎找不到一本能够放心推荐给开发者朋友——而不是科学家或大学生——的优秀程序员密码学实用图书,也就是同时具备现代密码学、通俗概念解释和代码示例的图书。我找到了非常优秀的学术著作,也发现了几本代码示例丰富的开发者图书,但后者要么质量不够高,要么过于聚焦某项具体技术,像 API 参考或库手册。其中一些也已经过时,但仍有一定价值。

面向开发者的免费密码学图书

以下是面向开发者、讲解实用密码学的免费图书

  • 《使用 Go 的实用密码学》(Kyle Isom 著,2015 年出版)是一本介绍如何使用 Go 语言进行密码学开发的小册子,包含大量代码示例。它提供可在线阅读的免费版本,也提供 PDF、EPUB 和 MOBI 格式的付费版本。这本书质量不错,但范围有限,只会非常简要地说明一些概念,并通过代码示例演示其用法。内容涵盖现代对称密码(如 AES-GCM 和 XSalsa20-Poly1305)、密钥派生(PBKDF2 和 Scrypt)、密钥交换与 ECDH、数字签名(ECDSA 和 Ed25519),以及其他少量概念。
  • 《密码学法则及 Java 代码》(Neal Wagner 著,2003 年出版)是一本学术风格的密码学图书,提供可运行的 Java 示例,用于实现 AES 密码和 RSA 密码系统等特定密码算法。
  • 《.NET 密码学精要》(Dirk Strauss 著,2017 年)汇集了使用 C# 调用 AES、哈希和 RSA 签名等密码学原语的 .NET 代码示例。它更像 API 参考,而不是一本认真解释何时以及如何使用这些密码算法、底层密码系统概念和底层算法细节的图书。

面向开发者的非免费密码学图书

我还可以列出一些对开发者友好、带有代码示例的实用密码学图书,但它们只有付费或商业版本,没有免费版。其中大多数与 C、C++、Java 或 JavaScript 等特定技术绑定得太紧密,对概念的解释也不够好;另一些图书的侧重点不同。有些已经过时,有些则相当新。下面是我在调研中找到的、对开发者友好的密码学图书:

  • 《严肃密码学:现代加密实用入门》(Jean-Philippe Aumasson 著)是一本优秀的密码学图书,将学术方法与实践方法结合起来,并针对部分概念提供 Python 代码示例。该书较新,出版于 2017 年,讲解 AES-GCM、ChaCha20-Poly1305 和抗量子密码学等现代密码学概念与密码套件。这可能是我找到的最佳图书。
  • 《C 与 C++ 安全编程实战》(John Viega 与 Matt Messier 著)为 C++ 开发者提供安全编码准则,其中包括哈希、MAC、对称密码、RSA、DSA 和随机数等密码学主题,并带有代码示例。出版于 2009 年,略显过时。
  • 《面向开发者的密码学》(Tom Denis 著)扎实介绍密码学与密码算法基础,并提供大量使用 C汇编语言编写的实现示例。写作风格介于学术著作与开发者图书之间,涵盖哈希、HMAC、AES,以及少量 RSA 和 ECC。出版于 2007 年,略显过时。
  • 《Java 密码学入门》(David Hook 著)是一本介绍 JCA、JCE、JSSE 和 Bouncy Castle 密码学库的参考书,包含大量 Java 代码示例。出版于 2005 年,已经过时。
  • 《面向 JavaScript 开发者的密码学:Web Cryptography API、SJCL》(Anish Nath 著)是一本包含大量 JS 代码示例的参考书,但没有解释对称密码、认证加密等概念。出版于 2018 年。
  • 《Python 密码学实战》(Samuel Bowne 著)是一本不错的小册子,共 87 页,出版于 2018 年,包含大量 Python 代码示例,但范围非常有限,只涉及哈希、AES 和 RSA,没有介绍签名、椭圆曲线、MAC 或密钥派生函数。
  • 《C 与 C++ 密码学》(Michael Welschenbach 著)说明如何使用 C / C++ 实现 AES 和 RSA 等密码算法,但没有介绍签名、椭圆曲线、MAC 或密钥派生函数。出版于 2005 年,已经过时。

市面上缺少一本面向开发者、包含代码示例、优秀且免费的密码学与密码算法实用图书,这更加坚定了我分享知识和技能、编写一本对开发者友好的密码学图书的决心。我很高兴能够成为首批为软件工程师出版高质量免费实用密码学图书的作者之一。

本书涵盖哪些内容?

本书介绍软件行业中使用的最重要的现代密码学概念、密码算法和密码学构造,并通过清晰的插图和可运行的代码示例进行演示:

  • 密码学哈希函数:概念、SHA-2、SHA-3、BLAKE2、RIPEMD160、代码示例、碰撞
  • MAC:概念、HMAC、CMAC、UMAC、应用、基于 MAC 的随机数生成器、代码示例
  • 密钥派生函数(KDF):概念、从密码生成加密密钥、PBKDF2、Scrypt、Bcrypt、Linux crypt()、Argon2、代码示例
  • 密码加密技术:从明文、哈希到 Argon2 等现代安全 KDF
  • 随机数与安全随机数生成器:概念、熵、安全随机数、CSPRNG、代码示例
  • 密钥交换技术:密钥建立与密钥协商、Diffie–Hellman 密钥交换(DHKE)和椭圆曲线 Diffie–Hellman(ECDH),以及代码示例
  • 加密概念:对称与非对称密码、秘密密钥、对称加密、加密方案、公钥密码系统、私钥与公钥、混合加密、数字签名
  • 现代对称密钥密码:概念、分组密码与流密码、分组密码工作模式(CBC、CTR、GCM)、AES(Rijndael)密码、Salsa20 / ChaCha20 密码,以及代码示例
  • 对称加密构造:认证加密、AES-256-GCM、ChaCha20-Poly1305、AES-256-CTR-HMAC,以及代码示例
  • 非对称密钥密码与公钥密码系统:RSA 密码系统(RSA 密钥对、加密、解密)、ECC(椭圆曲线密码学、椭圆曲线点与乘法、命名曲线)、ECDH(椭圆曲线 Diffie–Hellman)密钥交换,以及代码示例
  • 椭圆曲线:secp256k1、P-256、P-521、Curve25519、Curve448-Goldilocks 等常用命名曲线,以及代码示例
  • 集成加密方案:将公钥密码学与对称加密算法相结合、ECIES 混合加密方案,以及代码示例
  • 数字签名算法:概念、消息签名、签名验证、RSA 签名、ECDSA 和 EdDSA
  • 抗量子密码学:哪些经典密码系统会被量子计算攻破,哪些具备抗量子能力;SPHINCS+、NewHope 等抗量子签名和抗量子密钥交换算法,以及代码示例
  • 其他密码学概念:数字证书、TLS(传输层安全协议)、一次性密码(OTP)、外部身份验证和 OAuth
  • 面向开发者的密码学库与软件包:JavaScript、C#、Java、Python、C 和 C++ 中的密码学
  • 每个主要部分之后的大量代码示例和练习

为什么示例使用 Python?

Python 是最容易学习的语言之一,代码可读性强,所有开发者都容易理解,即使完全没有 Python 经验也不例外。代码示例的目的是展示密码算法、加密方案和其他密码学概念的实际运行,而不是推广某个特定的库、API、语言或技术。

请仅将这些代码示例用作参考,以了解代码可能具有的形式,并将其改写为你偏好的语言和框架。不要直接复制粘贴示例。有时,我们会选择更方便用户、更容易安装和使用的库,而不是另一家供应商提供的速度更快、可靠性更高的库。有时,我们会使用十六进制编码的密钥、密文、签名和其他值,以便在控制台上显示;但在实践中,大多数应用会使用二进制编码,以提升性能并减少网络开销。

你可以自由地将代码示例迁移到其他语言。本书末尾给出了如何在最常用的编程语言——JavaScriptC#JavaPython——中使用密码学的示例。我们没有提供 CC++ 等较低级语言的示例,因为它们更适合库作者高效实现特定算法,而不太适合应用开发者。CC++ 的设置与构建更复杂,管理项目依赖需要投入更多精力,也更容易出错。

大多数应用开发者,例如 Web、后端、移动端和前端开发者,都使用高级语言,如 JS、Python、C#、Java、PHP 和 Go;但他们都能理解示例中的 Python 代码。如果使用 C 编写这些代码,篇幅会更长、结构会更复杂,可读性也会更差。

Python 在各种环境中都得到广泛支持,包括 Linux、Windows、Mac、移动设备和微控制器。所有示例也可以在 Repl.itPythonAnywhere在线 Python 环境的虚拟机中运行。

如何阅读本书?

推荐按照主题顺序从头到尾阅读本书。你可以跳过不感兴趣的章节和小节,但最好至少浏览一遍,因为各部分内容之间存在内部依赖。

请亲自试用代码示例:运行、修改、破坏、探索并实验,通过动手实践来学习

尝试完成每章的实践练习。开发者通过编写代码学习最有效,这正是我的建议。每个主要部分之后都提供了表述清晰、输入输出明确的练习题,能够充分覆盖相应内容。

现在,开启你的现代实用密码学开发者之旅吧。祝你阅读愉快!

results matching ""

    No results matching ""