身份验证

介绍
本指南解释了如何在 Stacks 区块链上执行身份验证。
身份验证为用户提供了一种向应用程序识别自己的方式,同时对其凭证和个人信息保有完全控制权。
在您的应用程序中注册的用户随后可以使用支持 比特币名称系统 的任何其他应用程序进行身份验证,反之亦然。
Web2 与 Web3 身份验证
如果您来自 web2 世界,您可能习惯使用用户名和密码进行身份验证,其中用户信息存储在数据库中。输入密码后,会对其进行哈希并与数据库中存储的哈希进行比较,如果匹配,用户即可登录。
Web3 身份验证的工作方式略有不同。web3 的核心理念之一是数据所有权,这意味着用户可以控制他们的数据,包括他们的身份验证信息。
比特币和 Stacks 世界中的身份验证利用密码学生成私钥、公钥和地址。
我们将在此介绍基础知识,但如果你想深入了解, Learn Me a Bitcoin 是一个很好的起点。
要生成 Stacks 账户,我们从前一节讨论的 24 个助记词短语生成私钥。该私钥随后使用单向哈希函数生成公钥。也就是说,你可以从私钥推导出公钥,但不能反过来。
用户的私钥是其主要的安全来源并用于对其进行身份验证。不要丢失你的私钥。
所以,当我使用像 Leather 这样的钱包应用并想用它与像 StackingDAO 这样的去中心化应用进行身份验证时,我所做的是把我的私钥交给钱包,以证明我拥有相应的地址。
然后钱包会将该信息(我的地址和公钥)连同签名一起传递给应用程序。
签名可以被视为我拥有私钥的证明,而不会实际泄露私钥。这个机制使我能够使用相同的钱包和地址登录任何支持 Stacks 身份验证的应用。
Third Web 有一个很好的 概念性入门 关于 web3 身份验证。
对于更实用的介绍,请查看 快速入门 教程 和 Hiro 的 Stacks.js 文档.
工作原理
Stacks 的身份验证流程类似于集中式登录服务(例如 OAuth)使用的典型客户端-服务器流程。不过,在 Stacks 中,身份验证流程完全发生在客户端。
一个应用和认证器(例如 Leather 钱包)在身份验证流程中通过来回传递两个令牌进行通信。请求应用向认证器发送一个 authRequest 令牌。用户批准身份验证后,认证器会向应用响应一个 authResponse 令牌。
这些令牌基于 JSON Web 令牌(JWT)标准 ,并额外支持 secp256k1 曲线,该曲线被比特币和许多其他加密货币使用。它们通过 URL 查询字符串传递。
当用户选择对应用进行身份验证时,应用通过带有同名参数的 URL 查询字符串将 authRequest 令牌发送给认证器:
https://wallet.hiro.so/...?authRequest=j902120cn829n1jnvoa...
当认证器收到请求时,它使用临时传输密钥为应用生成一个 authResponse 令牌。临时传输密钥仅用于该应用的特定实例,在本例中用于对 authRequest.
应用在请求生成期间存储临时传输密钥。传输密钥的公有部分包含在 authRequest 令牌中。认证器使用该公有部分来加密一个应用私钥,并通过 authResponse.
将其返回给应用。
认证器从用户的身份地址私钥和应用的域生成应用私钥。应用私钥具有三个功能:
它用于创建凭证,使应用能够访问用户 Gaia 中心中的存储桶
这允许应用访问用户 Gaia 中心中与该应用相关的存储空间。
它用于对存储在用户 Gaia 存储中为该应用保存的文件进行端到端加密
该密钥用于加密文件,因此只有应用(使用派生密钥)可以解密它们。
它作为应用可用于执行其他加密功能的加密秘密
应用可以将此确定性秘密用于与用户身份和域相关的额外加密操作。
最后,应用私钥是确定性的,这意味着对于给定的 Stacks 地址和域,将始终生成相同的私钥。
密钥对 secp256k1 Stacks 的身份验证广泛使用公钥密码学,特别是使用
曲线的 ECDSA。
以下各节描述了使用的三对公私钥,包括它们如何生成、在哪里使用以及私钥向谁披露。
传输私钥
传输私钥是一个临时密钥,用于在身份验证过程中加密需要从认证器传递到应用的秘密。它在身份验证响应开始时由应用随机生成。 与传输私钥对应的公钥作为单元素数组存储在身份验证请求令牌的 public_keys
键中。认证器使用该公钥对诸如应用私钥等秘密数据进行加密,并在用户登录应用时将其发送回应用。传输私钥对应用身份验证请求进行签名。
身份地址私钥
身份地址私钥由用户的密钥链短语派生,是用户选择用于登录应用的 Stacks 用户名的私钥。它是用户拥有的秘密,永远不会离开用户的认证器实例。
该私钥对应用的身份验证响应令牌进行签名,以表明用户批准登录该应用。
应用私钥 应用私钥是一个特定于应用的私钥,通过使用 domain_name
作为输入,从用户的身份地址私钥生成。
最后更新于
这有帮助吗?