Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 仅允许授权代码调用库中的例程_C#_C++ - Fatal编程技术网

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

C# 仅允许授权代码调用库中的例程,c#,c++,C#,C++,好的,我将尝试在这里解释我的使用场景: 我有一个核心库的实现,其最低级别的访问是将数据输入数据库的API,数据库应作为一个子系统自包含。现在,出于奇怪的原因,该库向该数据库公开了一些关键参数,如登录ID和密码等。该库仅用于同一团队开发的某些大型应用程序的“内部”代码,其目的是阻止其他第三方客户端以二进制形式访问同一库。这是它变得更加丑陋的部分。为了实现这些相当“秘密”的功能,设计了一个先前确定的密钥的简单实现。比如,代码如下: string secretKey = "blah...$$$"; s

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

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

此功能在多个位置使用,仅当
secretKey
正确时,此功能才起作用。这似乎不是一个好方法,很容易发现。但是,它确实会在多个地方引起多个神奇字符串的警告,这使得
lint
工具非常不满意。手头的任务是仅删除这些
lint
警告。有人能提出一些“更好的”更糟糕的方法来实现这一点吗?

并没有回答您的lint问题,但您可以通过这种方式解决更大的问题:

首先,在你所有的东西上签名。然后,您可以查看调用堆栈以查看调用代码的程序集,并验证它是您的(代码使用公钥验证它是您的[可能不是一个好方法])。这是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();
    }
//此代码依赖于两个程序集的公钥是相同的。
System::Diagnostics::StackTrace^st=gcnew System::Diagnostics::StackTrace();
系统::反射::汇编^otherAsm=st->GetFrame(1)->GetMethod()->模块->汇编;
数组^otherKey=otherAsm->GetName()->GetPublicKey();
系统::反射::汇编^thisAsm=st->GetFrame(0)->GetMethod()->模块->汇编;
数组^thisKey=thisAsm->GetName()->GetPublicKey();
对于(int i=0;iLength;i++)
{
if(otherKey[i]!=thisKey[i])
抛出新异常();
}

有人能建议一些更好、更糟糕的方法来实现这一点吗?
是的:不要在dll/可执行文件中存储敏感数据。同意并注意。理解:需要纠正这一点。谢谢!:)C++中的<代码>核心库< /代码>吗?C中的调用方?是的,核心库是C++,调用方是C语言。通常,使用一个(秘密)密钥给程序集强名称,第三方没有这个密钥。所以您可以检查调用程序集的公钥是否等于混合模式C++/CLI程序集的公钥。明白!这段代码遍历整个调用堆栈,检查是否有任何东西没有相同的公钥,然后抛出异常。谢谢你的实施。在我完成解决方案之前,我会寻找更多的方法。它只检查当前帧和前一帧。您可以将其更改为检查整个堆栈,但这可能是不必要的。您最关心的是入口点,前面的框架是外部程序集。