身份验证

介绍

本指南解释了如何在 Stacks 区块链上执行身份验证。

身份验证为用户提供了一种向应用程序识别自己的方式,同时对其凭证和个人信息保有完全控制权。

在您的应用程序中注册的用户随后可以使用支持 比特币名称系统 的任何其他应用程序进行身份验证,反之亦然。

Web2 与 Web3 身份验证

如果您来自 web2 世界,您可能习惯使用用户名和密码进行身份验证,其中用户信息存储在数据库中。输入密码后,会对其进行哈希并与数据库中存储的哈希进行比较,如果匹配,用户即可登录。

Web3 身份验证的工作方式略有不同。web3 的核心理念之一是数据所有权,这意味着用户可以控制他们的数据,包括他们的身份验证信息。

比特币和 Stacks 世界中的身份验证利用密码学生成私钥、公钥和地址。

我们将在此介绍基础知识,但如果你想深入了解, Learn Me a Bitcoinarrow-up-right 是一个很好的起点。

要生成 Stacks 账户,我们从前一节讨论的 24 个助记词短语生成私钥。该私钥随后使用单向哈希函数生成公钥。也就是说,你可以从私钥推导出公钥,但不能反过来。

用户的私钥是其主要的安全来源并用于对其进行身份验证。不要丢失你的私钥。

所以,当我使用像 Leatherarrow-up-right 这样的钱包应用并想用它与像 StackingDAO 这样的去中心化应用进行身份验证时,我所做的是把我的私钥交给钱包,以证明我拥有相应的地址。

然后钱包会将该信息(我的地址和公钥)连同签名一起传递给应用程序。

签名可以被视为我拥有私钥的证明,而不会实际泄露私钥。这个机制使我能够使用相同的钱包和地址登录任何支持 Stacks 身份验证的应用。

Third Web 有一个很好的 概念性入门arrow-up-right 关于 web3 身份验证。

对于更实用的介绍,请查看 快速入门 教程 Hiro 的 Stacks.js 文档arrow-up-right.

工作原理

Stacks 的身份验证流程类似于集中式登录服务(例如 OAuth)使用的典型客户端-服务器流程。不过,在 Stacks 中,身份验证流程完全发生在客户端。

circle-info

此处的解释旨在帮助您了解该过程如何工作,但大部分功能由钱包和您使用的 JS 库处理。有关更多信息,请查看 Stacks.js 文档arrow-up-right

一个应用和认证器(例如 Leather 钱包arrow-up-right)在身份验证流程中通过来回传递两个令牌进行通信。请求应用向认证器发送一个 authRequest 令牌。用户批准身份验证后,认证器会向应用响应一个 authResponse 令牌。

这些令牌基于 JSON Web 令牌(JWT)标准arrow-up-right ,并额外支持 secp256k1 曲线,该曲线被比特币和许多其他加密货币使用。它们通过 URL 查询字符串传递。

当用户选择对应用进行身份验证时,应用通过带有同名参数的 URL 查询字符串将 authRequest 令牌发送给认证器:

https://wallet.hiro.so/...?authRequest=j902120cn829n1jnvoa...

当认证器收到请求时,它使用临时传输密钥为应用生成一个 authResponse 令牌。临时传输密钥仅用于该应用的特定实例,在本例中用于对 authRequest.

应用在请求生成期间存储临时传输密钥。传输密钥的公有部分包含在 authRequest 令牌中。认证器使用该公有部分来加密一个应用私钥,并通过 authResponse.

将其返回给应用。

1

认证器从用户的身份地址私钥和应用的域生成应用私钥。应用私钥具有三个功能:

它用于创建凭证,使应用能够访问用户 Gaia 中心中的存储桶

2

这允许应用访问用户 Gaia 中心中与该应用相关的存储空间。

它用于对存储在用户 Gaia 存储中为该应用保存的文件进行端到端加密

3

该密钥用于加密文件,因此只有应用(使用派生密钥)可以解密它们。

它作为应用可用于执行其他加密功能的加密秘密

应用可以将此确定性秘密用于与用户身份和域相关的额外加密操作。

最后,应用私钥是确定性的,这意味着对于给定的 Stacks 地址和域,将始终生成相同的私钥。

密钥对 secp256k1 Stacks 的身份验证广泛使用公钥密码学,特别是使用

曲线的 ECDSA。

以下各节描述了使用的三对公私钥,包括它们如何生成、在哪里使用以及私钥向谁披露。

传输私钥

传输私钥是一个临时密钥,用于在身份验证过程中加密需要从认证器传递到应用的秘密。它在身份验证响应开始时由应用随机生成。 与传输私钥对应的公钥作为单元素数组存储在身份验证请求令牌的 public_keys

键中。认证器使用该公钥对诸如应用私钥等秘密数据进行加密,并在用户登录应用时将其发送回应用。传输私钥对应用身份验证请求进行签名。

身份地址私钥

身份地址私钥由用户的密钥链短语派生,是用户选择用于登录应用的 Stacks 用户名的私钥。它是用户拥有的秘密,永远不会离开用户的认证器实例。

该私钥对应用的身份验证响应令牌进行签名,以表明用户批准登录该应用。

应用私钥 应用私钥是一个特定于应用的私钥,通过使用 domain_name

作为输入,从用户的身份地址私钥生成。

最后更新于

这有帮助吗?