【数据加密】如何使用针对JavaScript和Node.js的AWS加密SDK在浏览器中启用加密

视频号

微信公众号

知识星球

Chinese, Simplified

在这篇文章中,我们将向您展示如何使用AWS Encryption SDK(“ESDK”)for JavaScript来处理假设应用程序的浏览器内加密工作负载。首先,我们将回顾加密的一些安全和隐私属性,包括AWS为典型应用程序的不同组件使用的名称。然后,我们将讨论您可能想要加密每个组件的一些原因,重点是浏览器内加密,我们将描述如何使用ESDK执行加密。最后,我们将讨论在设计应用程序时需要注意的一些安全属性,以及在哪里可以找到其他资源。

加密的安全性和隐私性概述

加密是一种技术,可以通过使敏感数据在没有密钥的情况下无法读取来限制对敏感数据的访问。加密过程采用可读或可处理的数据(“明文”),并使用数学原理来模糊内容,这样在不使用密钥的情况下就无法读取。为了保护用户隐私并防止未经授权泄露敏感业务数据,开发人员需要在整个数据生命周期中保护敏感数据的方法。当数据在应用程序的收集、存储、处理和共享组件之间流动时,需要保护数据免受与无意披露相关的风险。在这种情况下,加密通常分为两种不同的技术:用于存储数据的静态加密;以及用于在实体或系统之间移动数据的传输中的加密。

许多应用程序在传输过程中使用加密来保护用户与他们提供的服务之间的连接,然后在数据存储之前对其进行加密。然而,随着应用程序变得越来越复杂,数据必须在更多节点之间移动,并存储在更多样化的地方,数据意外泄露或无意泄露的机会也越来越多。当用户在浏览器中输入数据时,传输层安全性(TLS)可以保护在用户浏览器和服务端点之间传输的数据。但在分布式系统中,端点和处理敏感数据的服务之间的中间服务可能会在传输数据之前记录或缓存数据。在浏览器中收集敏感数据时对其进行加密是一种静态加密形式,可以最大限度地降低未经授权访问的风险,并在数据丢失、被盗或意外暴露时保护数据。在浏览器中加密数据意味着,即使它在其他地方完全暴露,对任何无法访问密钥的人来说,它都是不可读的,毫无价值。

典型的web应用程序

典型的web应用程序会接受一些数据作为输入,对其进行处理,然后存储。当用户需要访问存储的数据时,数据通常遵循输入时使用的相同路径。在我们的示例中,路径有三个主要组件:

  • 收集数据(通常通过网络表单或文件上传)
  • 数据处理(通过亚马逊弹性计算云(Amazon EC2)、亚马逊弹性容器服务、AWS Lambda或类似服务)
  • 数据存储(通过亚马逊简单存储服务(Amazon S3)、亚马逊弹性块存储或在亚马逊Aurora等数据库中)

EncryptBoundaries-Problem

图1:一个假设的web应用程序,其中应用程序由与浏览器前端交互的最终用户、处理从浏览器接收的数据的第三方组成,处理在Amazon EC2中执行,存储在Amazon S3中

  1. 最终用户使用浏览器中的界面与应用程序进行交互。
  2. 当数据被发送到亚马逊EC2时,它会通过第三方的基础设施,第三方可能是互联网服务提供商、用户环境中的设备或运行在云中的应用程序。
  3. 亚马逊EC2上的应用程序在收到数据后会对其进行处理。
  4. 一旦应用程序处理完数据,它就会存储在AmazonS3中,直到再次需要它为止。

当数据在组件之间移动时,TLS用于防止无意中泄露。但是,如果其中一个或多个组件是不需要访问敏感数据的第三方服务,该怎么办?这就是加密的用武之地。

静态加密可作为服务器端、客户端和客户端的浏览器保护。

  • 服务器端加密(SSE)是AWS客户最常用的加密形式,这是有充分理由的:它很容易使用,因为它受到许多服务的本地支持,如亚马逊S3。当使用SSE时,存储数据的服务将在收到每条数据时使用密钥(“数据密钥”)对其进行加密,然后在授权用户请求时对其进行透明解密。这对应用程序开发人员来说是无缝的,因为他们只需要在AmazonS3中选中一个框就可以启用加密,而且它还通过拥有下载对象和执行解密操作的单独权限来添加额外级别的访问控制。然而,需要考虑安全性/便利性的权衡,因为服务将允许任何具有适当权限的角色执行解密。为了进行额外的控制,包括S3在内的许多AWS服务都支持使用客户管理的AWS密钥管理服务(AWS KMS)AWS KMS密钥(KMS密钥),允许您指定密钥策略或使用授权或AWS身份和访问管理(IAM)策略来控制哪些角色或用户可以访问解密,以及何时访问。使用客户管理的KMS密钥配置解密权限通常足以满足要求“应用程序级加密”的法规遵从性制度
  • 一些威胁模型或合规机制可能需要客户端加密(CSE),这可能会以牺牲额外复杂性为代价,增加强大的额外访问控制级别。如上所述,服务在数据离开应用程序边界后对数据执行服务器端加密。TLS用于保护传输到服务的数据,但有些客户可能只想在EC2或浏览器上的应用程序中管理加密/解密操作。应用程序可以使用AWS加密SDK在将数据发送到存储服务之前对应用程序信任边界内的数据进行加密。

但是,如果客户甚至不希望明文数据离开浏览器,该怎么办?或者,如果最终用户输入的数据由属于第三方的中间系统传递或记录,该怎么办?可以创建一个单独的应用程序,只管理加密,以确保您的环境被隔离,但使用AWS encryption SDK for JavaScript可以在数据发送到应用程序之前在最终用户浏览器中对数据进行加密,因此只有您的最终用户才能查看其明文数据。如下图2所示,浏览器内加密可以允许不受信任的中间系统安全地处理数据,同时确保其机密性和完整性。

EncryptBoundaries-Solution

图2:一个假设的加密web应用程序,其中应用程序由与浏览器前端交互的最终用户、处理从浏览器接收的数据的第三方组成,处理在Amazon EC2中执行,存储在Amazon S3中

  1. 浏览器中的应用程序请求数据密钥,以便在用户输入的敏感数据传递给第三方之前对其进行加密。
  2. 由于敏感数据已被加密,第三方无法读取。第三方可能是互联网服务提供商、用户环境中的设备、运行在云中的应用程序或各种其他参与者。
  3. AmazonEC2上的应用程序可以向KMS请求解密数据密钥,以便对数据进行解密、处理和重新加密。
  4. 加密的对象被存储在S3中,在S3中进行第二加密请求,从而当对象被存储到服务器侧时可以对其进行加密。

如何在浏览器中加密

浏览器内加密的第一步是包括用于JavaScript的AWS加密SDK的副本,以及用户访问您的应用程序时已发送给用户的脚本。一旦它出现在最终用户环境中,应用程序就可以进行调用。为了执行加密,ESDK将向加密材料提供商请求用于加密的数据密钥,以及将与加密对象一起存储的数据密钥的加密副本。在浏览器中对一段数据进行加密后,密文可以上传到应用程序后端进行处理或存储。当用户需要检索明文时,ESDK可以读取附在密文上的元数据,以确定解密数据密钥的适当方法,并且如果他们可以访问KMS密钥,则解密数据密钥,然后使用它来解密数据。

重要注意事项

基于浏览器的应用程序的一个常见问题是不同浏览器供应商和版本的功能支持不一致。例如,如果浏览器缺乏对推荐的最强加密算法套件的本地支持,应用程序将如何响应?或者,如果用户使用禁用JavaScript的浏览器访问应用程序,会有消息或替代模式吗?ESDK for JavaScript本机支持回退模式,但它可能不适用于所有用例。请务必了解您需要支持哪种浏览器环境,以确定浏览器内加密是否合适,如果您希望获得有限的浏览器支持,请包括对优雅降级的支持。开发人员还应考虑未经授权的用户可能通过浏览器扩展监控用户操作、在用户不知情的情况下发出未经授权浏览器请求或请求“降级”(数学密集度较低)加密操作的方式。

让安全专业人员审查您的应用程序设计总是一个好主意。如果您有AWS客户经理或技术客户经理,您可以要求他们将您与解决方案架构师联系,以审查您的设计。如果您是AWS客户,但没有客户经理,请考虑访问AWS阁楼,参与我们的“询问专家”计划。

本文地址
https://architect.pub/how-enable-encryption-browser-aws-encryption-sdk-javascript-and-nodejs
SEO Title
How to enable encryption in a browser with the AWS Encryption SDK for JavaScript and Node.js