存储敏感硬编码值的理想方法
本文关键字:理想 方法 编码值 存储 | 更新日期: 2023-09-27 17:56:32
我的应用程序需要使用固定值的特定使用者密钥和使用者机密发布到 Twitter。
我在确定将这些值安全地存储在我的应用程序中的最佳方式时遇到问题(用户应该无法使用其他 Twitter 应用程序 - 只有我的应用程序)。
以下是我已经尝试过的一些事情:
方案 1:存储在应用中设置中
失败 - 应用设置最初未加密。
方案 2:存储为硬编码值并使用 Dotfuscator
失败 - 变量在经过模糊处理后在反射器中清晰可见。
方案 3:加密并存储为硬编码值。
失败 - 虽然这通过了方案 1,但密钥本身将被硬编码(以确保它生成正确的解密值),并且对方案 2 可见。
我遇到的主要问题是,为了让Twitter识别我的消费者密钥/秘密,它们需要被解密,但是我不希望在应用程序本身中明确设置此值。
我解决这个问题的最佳方法是什么?
正如Stephen C.在如何保护OAuth密钥免受用户反编译我的项目?的回答中提到的,你无能为力。
我最好的选择是让它尽可能困难,但要意识到它从来都不是真正安全的。
应用程序设置最初未加密
您可以使用ProtectedData
类对此类数据进行加密/解密,并将加密值存储在.settings
:
public static String Encrypt(this String unSecuredString)
{
if (String.IsNullOrEmpty(unSecuredString))
return unSecuredString;
var decryptedData = Encoding.UTF8.GetBytes(unSecuredString);
var encryptedData = ProtectedData.Protect(decryptedData, null, DataProtectionScope.CurrentUser);
return Convert.ToBase64String(encryptedData);
}
public static String Decrypt(this String securedString)
{
if (String.IsNullOrEmpty(securedString))
return securedString;
var encryptedData = Convert.FromBase64String(securedString);
var decryptedData = ProtectedData.Unprotect(encryptedData, null, DataProtectionScope.CurrentUser);
return Encoding.UTF8.GetString(decryptedData);
}