如何生成 OAuth 2 客户端 ID 和密钥

Posted

技术标签:

【中文标题】如何生成 OAuth 2 客户端 ID 和密钥【英文标题】:How to generate OAuth 2 Client Id and Secret 【发布时间】:2014-07-02 08:40:54 【问题描述】:

我想使用 .NET 生成客户端 ID 和客户端密码。我阅读了 OAuth 2 规范,例如此处未指定客户端密码的大小。有没有使用 .NET 框架生成客户端 ID 和客户端密码的好习惯???

【问题讨论】:

第一个问题是为什么要自己生成这些。如果您只打算在应用中包含 OAuth,那么当您向每个 oauth 提供者注册应用时,会向您提供 id 和 secret。 我有自己的 oauth 提供者,我必须向客户端应用程序提供客户端 ID 和密码。 【参考方案1】:

这是在 PowerShell 中生成 ClientSecret 密钥的代码

$bytes = New-Object Byte[] 32
$rand = [System.Security.Cryptography.RandomNumberGenerator]::Create()
$rand.GetBytes($bytes)
$rand.Dispose()
$newClientSecret = [System.Convert]::ToBase64String($bytes)
$newClientSecret

我在这里找到它https://docs.microsoft.com/en-us/sharepoint/dev/sp-add-ins/replace-an-expiring-client-secret-in-a-sharepoint-add-in#generate-a-new-secret

【讨论】:

【参考方案2】:

正如 OAuth 2.0 授权框架的 section 2.2 所说:

授权服务器向注册的客户端发出客户端 identifier -- 代表注册的唯一字符串 客户提供的信息。客户端标识符不是 秘密;它向资源所有者公开,不得使用 单独用于客户端身份验证。客户端标识符是唯一的 授权服务器。

客户端标识符字符串大小未定义 规格。客户应避免对 标识符大小。授权服务器应该记录大小 它发出的任何标识符。

所以你可以自己定义客户端标识符。这取决于你的选择。你可以使用System.Guid简单生成一个,或者使用uid + systemTime,也可以Hash它,加密它或任何你想要的。

但客户端密码应该是一个加密强度高的随机字符串。你可以像这样生成一个:

RandomNumberGenerator cryptoRandomDataGenerator = new RNGCryptoServiceProvider();
byte[] buffer = new byte[length];
cryptoRandomDataGenerator.GetBytes(buffer);
string uniq = Convert.ToBase64String(buffer);
return uniq;

您也可以使用加密哈希函数()对 UUID+SystemTime+somthingelse 进行哈希处理以自己实现。

如果想了解更多实践,可以参考some open implementations from here.

【讨论】:

【参考方案3】:

appendices A.1 and A.2 在其 ABNF 语法中将 client_idclient_secret 的格式定义为 *VSCHAR,其中 VSCHAR 定义为

VSCHAR     = %x20-7E

表示可打印的 ASCII 字符集。 client_id 的长度未由规范指定,如 noted 由 @Owen Tsao 指定。这意味着,虽然您可以选择一个随机的字节序列并将它们编码为 base64,但出现在 base64 中的字符集仅代表可用于此应用程序的严格子集。

【讨论】:

以上是关于如何生成 OAuth 2 客户端 ID 和密钥的主要内容,如果未能解决你的问题,请参考以下文章

OAuth2 客户端 ID 和客户端密钥的安全性

Google文档是否已过时?

Oauth 2.0:客户端 ID 和客户端密码暴露,这是一个安全问题吗?

使用 OAuth2 的 API 网关的客户端凭据 [关闭]

通过 OAuth 2.0 自动使用 google-api-dotnet-client

如何保护 Oauth 2.0 客户端 ID 和客户端密码