在哪里/如何存储或生成客户端机密?

Posted

技术标签:

【中文标题】在哪里/如何存储或生成客户端机密?【英文标题】:Where/How to store or generate the Client Secrets? 【发布时间】:2021-07-15 14:12:42 【问题描述】:

我正在使用 C# .NET 和 YouTubeAPI-Nuget 包。

该项目是一个桌面应用程序 (Avalonia),我需要访问用户的 YouTube 频道(例如更改视频标题)。

我不明白我需要如何或在哪里存储客户端机密,或者我是否可以生成它们,或者我将如何在用户无法访问我的客户端机密的情况下分发程序。

是否每个想要使用我的程序的用户都需要自己的客户端机密文件?如果是这样,我如何自动生成它? (因为我不想为每个想要使用它的用户手动生成客户端机密)

如果他们只需要一个客户端机密,那么我如何在不将纯文本文件放入安装文件夹的情况下分发它?

我真的不知道也找不到任何关于这应该如何工作的信息。

【问题讨论】:

【参考方案1】:

我不明白我需要如何或在哪里存储客户端机密,或者我是否可以生成它们,或者我将如何在用户无法访问我的客户端机密的情况下分发程序。

由于您有一个桌面应用程序,因此在编译它时,请确保将其编译为应用程序的一部分,不要将 clientsecret.json 作为文件与您的应用程序一起发送,例如 dll。它应该编译到您的应用程序中并以这种方式分发。如果你想要更多的 OTT,你可以将它存储在你的服务器上和端点上,让你的桌面应用程序在它运行或安装时获取它并在本地存储数据。

是否每个想要使用我的程序的用户都需要自己的客户端机密文件?如果是这样,我如何自动生成它? (因为我不想为每个想要使用它的用户手动生成客户端机密)

您的应用程序不应有一个客户端 ID 和客户端密钥对,供所有用户使用。

如果他们只需要一个客户端机密,那么我如何在不将纯文本文件放入安装文件夹的情况下分发它?

我还没有看到您的代码,但您真正需要的只是客户端 ID 和客户端密码本身作为常量存储在您的应用程序的某个地方。您实际上并不需要文件本身。

【讨论】:

所以我需要将它编译到应用程序中,快速搜索找到了我的 ASP.NET 应用程序秘密。也许我也可以将它用于 .net 应用程序,谢谢。我不想使用服务器。顺便说一句,如果你想看的话,这里是代码:github.com/TheSwerik/YouTubeStreamTemplates 请记住,您不能将您的客户 ID 作为开源项目的一部分发布,也不允许与任何人共享。 是的,客户端 ID 在我的机器上是本地的,从 git 中排除。问题只是我需要找出如何安全地分发秘密,但这可能是一个新的 *** 问题。 我已经做了两次,一次我把它作为一个常量包含在项目中,然后用它编译它。第二次我们将它作为 api 端点,应用程序根据需要从中获取它。它当然是加密的。 所以我的想法是让 CI 在发布之前替换 C# (.cs) 文件中的字符串值。这不会很好,但它会在灰色区域,对吗?【参考方案2】:

但是...散列或加密代码中的字符串,因为在记事本中打开可执行文件可以以明文形式公开字符串。最好用字符串加密来混淆......

【讨论】:

【参考方案3】:

好的,以上答案是我的答案,但我想(通过代码)分享我将如何按照他们所说的去做。

    我的 CI 将获取我的客户端 ID 和机密以及机密(我正在使用 Github Actions)。

    我在代码中创建字符串常量:

private const string ClientId = "CLIENT_ID";
private const string ClientSecret = "CLIENT_SECRET";
    让 CI 将这些代码行更改为实际的客户端 ID 和密码
private const string ClientId = "ACTUAL_CLIENT_ID";
private const string ClientSecret = "ACTUAL_CLIENT_SECRET";
    让 CI 在dotnet publish 之后混淆生成的 dll,这样就更难反编译了。 (我正在尝试让 ConfuserEx 工作)

【讨论】:

以上是关于在哪里/如何存储或生成客户端机密?的主要内容,如果未能解决你的问题,请参考以下文章

在 App Engine 上的 Django 应用上存储客户端机密

如何在 CI 管道中存储多个客户端的机密文件?

安全地存储客户端机密

如何在本机应用程序上存储 OAuth 客户端 ID

如何在数据库中存储加密的机密用户信息,需要在运行时解密?

在 Spark 2.1 独立集群的客户端部署模式下,RDD 或 Spark SQL 数据帧在哪里存储或持久化?