如何在 c# 应用程序中正确保护 api 凭据

Posted

技术标签:

【中文标题】如何在 c# 应用程序中正确保护 api 凭据【英文标题】:How to correctly secure api credentials in a c# application 【发布时间】:2017-06-04 07:15:21 【问题描述】:

好的,所以只是关于设置的一点背景。

我目前有一个 Web Api2 项目,它是这个 restful api 的服务器端。客户端当前使用用户名/密码组合来获取承载令牌,然后在后续 api 调用中使用该令牌。该项目存储在 GitHub 上的私有项目中。

我正在寻找构建和部署将使用此 api 的 c# windows 服务。 与此 Windows 服务一起部署/存储凭据的最佳做法是什么。

我控制 api 的两端,我也将控制 Windows 服务的部署。这将被打包为一个 msi,并通过一些第 3 方软件(自动)进行部署。

这里是要求

凭据不能存储在源代码管理中 凭据在客户端不能是纯文本格式。

所以我的问题是,我如何将 api 凭据以可用的格式而不是纯文本格式发送到客户端?

或者我应该为 api 寻找不同类型的身份验证?我简要介绍了 oauth2,但据我所知,您需要客户端有人接受吗?

如果有人对如何实现这一点有任何建议或资源,那就太好了。

【问题讨论】:

【参考方案1】:

我不是专家,但我有类似的情况,我会抓住机会获得一些反对票:0)

桌面/服务应用程序中的一种方法是要求用户输入凭据。如果可能,那么这是最适合您的方式。 如果用户甚至可以输入一次凭据,您可以保存使用ProtectedData 加密的数据(使用此类您不必在代码中保存加密密钥,这很容易提取(使用反射器... ))。

但是,如果您想自动执行此操作并存储凭据,则没有一个好的方法。 您可以混淆凭据,并防止脚本儿童看到它们,但对于更严重的黑客来说,它会很容易被破解。

还有其他几个选项,但它们都是可破解的。 另一种方法是在服务器上使用 MAC 地址和随机字符串(GUID 将完成这项工作)注册每台机器,这些字符串使用 ProtectedData 类保存,然后只有这个特定的键值对才能从中获取数据你的 API。 你有两个问题:

    如果用户卸载应用程序并重新安装,那么他将无法重新连接到服务器(因为他无法重新生成相同的 GUID)。您可以删除服务器中的用户并创建一个新用户,但您不能只更改服务器上的 guid,因为任何人都可以破解服务器上的用户数据。 任何人都可以在您的 API 上打开用户并使用它。

【讨论】:

我将把它标记为答案,因为虽然它没有直接解决问题,但它让我走上了正确的道路。有问题的客户端服务器已经存储了一个 GUID,可以作为另一个 3rd 方软件的一部分进行访问。这些 GUID 也可以从服务器端获得,因此我们决定使用技术上“开放”的 API,使用该 GUID 作为身份验证

以上是关于如何在 c# 应用程序中正确保护 api 凭据的主要内容,如果未能解决你的问题,请参考以下文章

“运行时检查失败 #0 - ESP 的值未在函数调用中正确保存”从 C++ 代码成功 C# 回调后

如何在 GWT Web 应用程序中正确实现 DAO?

如何在 maven pom.xml 中正确定义插件版本?

如何在核心数据中正确保存可转换对象?

如何在iOS7中正确定位后退按钮

如何在 django 中正确保存多个文件?