本篇为大家介绍一个加密存储数据到 OptionPane 的案例。
案例背景
AI 应用开发需要调用大模型开放的接口,API Key 便是必不可少的(以下使用 deepseek-v3 示范)。
关于如何获取且调用 deepseek 的 api key,可以访问官方文档 首次调用 Deepseek API Docs,这里不再赘述。
在集成 AI 到 VSIX 扩展应用过程中,如何存储且获取 API Key 是首先要考虑的,关键的需求如下:
- API Key 不可明文存储;
- API Key 不可明文展示;
- 需要是一个全局变量,不可直接在源代码中声明使用;
- 用户可以随时编辑。
案例解析
首先要解决的是:不可直接存储明文,这就需要在存储 API key 到 OptionPane
之前对用户输入的数据进行加密。
csharp
public static string EncrySecureString(SecureString secureString)
{
byte[] encryptedData = ProtectedData.Protect(
Encoding.UTF8.GetBytes(ToInsecureString(secureString)),
optionEntropy: null,
scope: DataProtectionScope.CurrentUser
);
}
而在调用 API 时则需要先获取存储在全局的加密数据,然后解密利用解密后的数据向 deepseek 大模型发送请求。
csharp
public static SecureString DecryptToSecureString(string encryptedBase64)
{
byte[] encryptedBytes = Covert.FromBase64String(encryptedBase64);
byte[] decryptedBytes = ProtectedData.Unprotect(
encryptedBytes,
optionEntropy: null,
scope: DataProtectionScope.CurrentUser
);
return ToSecureString(Encoding.UTF8.GetString(decryptedBytes));
}
其次不可直接将存储在全局的数据直接展示给用户,应当类似 Password 的风格,如下图: VSIX 提供了 OptionPane 接口用于存储全局的数据,用户可导航至 Tools >Option 找到 Visual Studio IDE 的所有全局配置标签页,如下图:
注
最后需要注意明文不可在代码内存中保留太长时间,这意味着在用户输入 API key 时,不可以直接使用 WPF.textbox 以普通字符串的形式接收用户输入的值,可以使用 SecureString 接收用户的输入值。 在 C# 中,SecureString 是一种用于安全存储敏感数据(如密码、密钥等)的特殊字符串类型。其核心设计目标是通过加密和内存管理机制,降低敏感数据在内存中暴露的风险。 而在请求发出后/时,应当立刻清理内存中的明敏感数据。这需要使用 byte[] 存储解密后的数据(在 C# 中普通字符串无法被安全地擦除)。最大的减少作用域,并且利用 Array.Clear() 清理 byte[] 数据。