好的,我会在这里尝试解释我的使用场景: 我有一个核心库的实现,该库的最低级别访问是将数据输入数据库的API,这些数据库应作为子系统自包含。现在,出于奇怪的原因,该库向该数据库公开了关键参数,如登录ID和密码等。它仅用于同一个团队开发的某些较大应用程序的“内部”代码,其目的是禁止其他二进制访问同一库的第三方客户端使用这些API。这是它变得更难看的部分。为了实现这些相当“秘密”的功能,设计了先前确定的秘密密钥的简单实现。说,这样的代码:
string secretKey = "blah...$$$";
string password = library::secretGetPwd(secretKey);
这在多个地方使用,并且仅在secretKey
正确的情况下该功能才起作用。这似乎不是一个好方法,很容易发现。但是,它确实会在多个位置引起多个魔术字符串的警告,这使lint
工具非常不满意。当前的任务是仅删除这些lint
警告。有人可以建议一些“更好”的更坏方法来实现这一目标吗?
答案 0 :(得分:2)
不回答您的皮棉问题,但是您可以通过以下方式解决较大的问题:
首先,强烈签名所有内容。然后,您可以浏览调用堆栈以查看调用该代码的程序集,并验证它是否属于您(该代码使用公共密钥来验证它属于您的代码[可能不是一个好方法])。这是100%安全的吗?我对此表示怀疑。
//This code relies on the public keys of the two assemblies to be the same.
System::Diagnostics::StackTrace^ st = gcnew System::Diagnostics::StackTrace();
System::Reflection::Assembly ^ otherAsm = st->GetFrame(1)->GetMethod()->Module->Assembly;
array<unsigned char, 1> ^ otherKey = otherAsm->GetName()->GetPublicKey();
System::Reflection::Assembly ^ thisAsm = st->GetFrame(0)->GetMethod()->Module->Assembly;
array<unsigned char, 1> ^ thisKey = thisAsm->GetName()->GetPublicKey();
for (int i = 0; i < thisKey->Length; i++)
{
if (otherKey[i] != thisKey[i])
throw gcnew Exception();
}