我正在编写一段C ++代码,该代码将保存加密存档的访问密钥,并且不允许在Linux系统上的特定日期之前查看它。
完整的代码如下(是的,它很难看并且有一个system()
电话。我觉得这对于给定的情况是必要的):
#include <iostream> //cout
#include <ctime> //time_t, time()
#include <cstdlib> //system()
#include <unistd.h> //getuid()
using namespace std;
int main () {
//updates the system clock and catches the exit code; must be 0 to proceed
int tcheck = system ("ntpd -q -I pool.ntp.org");
//checks updated time against set timestamp (11/20/16 @ 12 PM) and gives or denies access to key respectively
if ((tcheck == 0) && (getuid() = 0)) {
time_t now = time(0);
if (now < 1479661235)
{cout << "It is not yet time.";}
else
{cout << "The key is: a placeholder";}
}
else if (getuid() != 0)
{cout << "This program must be run as root.";}
else if (tcheck != 0)
{cout << "I think you might be cheating. Let the time server sync and then we'll talk.";}
cin.get();
return 0;
}
我的问题如下。具有sudo
权限的用户(只有手头的可执行文件)必须无法访问密钥,但这样的用户只需删除/bin/ntpd
并将其替换为虚拟程序就相对容易了。在被叫时返回0,从而规避时间篡改保护。
我考虑使用校验和来确保程序的有效性,但基于以下事实丢弃了这一点:临时中对ntp软件包的更新也可能会更改ntpd并使密钥无法访问。我也不能从包管理器中调用ntpd的校验和,因为代码必须可以在多个发行版中移植。
对于如何确保程序的有效性(或完全不同的方法来完成相同的结果),你们是否有任何想法?
PS:在你提到它之前,我确实计划对源进行模糊处理以避免反编译器利用,所以这不会成为一个问题。答案 0 :(得分:0)
鉴于网络必须始终可用以使用该程序,请将所有安全性移至服务器。在客户端,你只需要像
那样的东西wget https://www.yourserver.com/getkey?keyid=xxxxxxxxxxxxxxxxxxxxx
keyid
的参数是所需密钥的某个标识符(也许它的SHA1有一些秘密,但无论如何);然后,只有到时候,您的服务器才会提供所需的密钥。