如何使用 PowerShell 对 OAuth 公共客户端的 PKCE 代码进行编码



我正在尝试生成一个 43 个八位字节(字节(的字符串,用作使用 PowerShell 进行 OAuth 身份验证的代码验证器,如RFC7636中所述。

  1. 协议

4.1. 客户端创建代码验证程序

客户端首先为每个代码验证程序"code_verifier"创建一个 OAuth 2.0 [RFC6749] 授权请求,方式如下:

code_verifier = 高熵加密随机字符串,使用 非保留字符 [A-Z]/[a-z]/[0-9]/"-"/"."/"_"/"~">
来自 [RFC3986] 的第 2.3 节,最小长度为 43 个字符 最大长度为 128 个字符。

"code_verifier"的ABNF如下。

代码验证器 = 43*128未保留 未保留 = 字母/数字/"-"/"."/"_"/"~" ALPHA = %x41-5A/%x61-7A 数字 = %x30-39

注意:代码验证器应该有足够的熵来猜测该值
不切实际。建议输出 合适的随机数生成器用于创建 32 个八位字节
序列。 然后对八位字节序列进行 base64url 编码,以生成
43 个八位字节 URL 安全字符串以用作代码验证程序

我发现使用 RNGCryptoServiceProvider 类更有可能生成高熵随机数,但当我将其转换为 base64 字符串时,它包含不需要的字符。

$RandomNumberGenerator = New-Object System.Security.Cryptography.RNGCryptoServiceProvider
$Bytes = New-Object Byte[] 32
$RandomNumberGenerator.GetBytes($Bytes)
[System.Convert]::ToBase64String($bytes)

如何使用 RNGCryptoServiceProvider 生成兼容的 base64 字符串?

您需要 Url-safe Base64 编码,这可以通过使用 System.Web 中的 [System.Web.HttpServerUtility]::UrlTokenEncode(( 方法来完成。

Add-Type -AssemblyName System.Web
$RandomNumberGenerator = New-Object System.Security.Cryptography.RNGCryptoServiceProvider
$Bytes = New-Object Byte[] 32
$RandomNumberGenerator.GetBytes($Bytes)
[System.Web.HttpServerUtility]::UrlTokenEncode($Bytes)

最后一个字符可以是填充字符。对于"普通"Base64,使用=UrlTokenEncode()使用不同的(url安全(字母表,其中填充字符1用以下方法修剪最后一个填充字符应该是非常安全的:

([System.Web.HttpServerUtility]::UrlTokenEncode($Bytes)).TrimEnd("1")

([System.Web.HttpServerUtility]::UrlTokenEncode($Bytes)).Substring(0, 43)

以确保您获得 43 个字符的字符串。

最新更新