仅允许授权代码调用库中的例程

时间:2018-07-11 05:27:17

标签: c# c++

好的,我会在这里尝试解释我的使用场景: 我有一个核心库的实现,该库的最低级别访问是将数据输入数据库的API,这些数据库应作为子系统自包含。现在,出于奇怪的原因,该库向该数据库公开了关键参数,如登录ID和密码等。它仅用于同一个团队开发的某些较大应用程序的“内部”代码,其目的是禁止其他二进制访问同一库的第三方客户端使用这些API。这是它变得更难看的部分。为了实现这些相当“秘密”的功能,设计了先前确定的秘密密钥的简单实现。说,这样的代码:

string secretKey = "blah...$$$";
string password = library::secretGetPwd(secretKey);

这在多个地方使用,并且仅在secretKey正确的情况下该功能才起作用。这似乎不是一个好方法,很容易发现。但是,它确实会在多个位置引起多个魔术字符串的警告,这使lint工具非常不满意。当前的任务是仅删除这些lint警告。有人可以建议一些“更好”的更坏方法来实现这一目标吗?

1 个答案:

答案 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();
    }