【发布时间】:2017-01-31 16:27:10
【问题描述】:
假设您有一个函数可以为您的应用程序生成一些安全令牌,例如一些哈希盐,或者可能是对称或非对称密钥。
现在假设您在 C++ 中将此函数作为 constexpr 使用,并且您根据某些信息(如内部版本号、时间戳等)为构建生成密钥。
作为一个勤奋的程序员,请确保并以适当的方式调用它,以确保它只在编译时被调用,因此死剥离器会从最终的可执行文件中删除代码。
但是,您永远无法确定其他人不会以不安全的方式调用它,或者编译器可能不会删除该函数,然后您的安全令牌算法将成为公众知识,使攻击者更容易猜测未来的令牌。
或者,抛开安全性不谈,假设该函数需要很长时间才能执行,并且您希望确保它在运行时不会发生,并且不会给最终用户带来糟糕的用户体验。
有什么方法可以确保永远不会在运行时调用 constexpr 函数?或者,在运行时抛出一个断言或类似的东西是可以的,但显然不如编译错误那么理想。
我听说有一些方法涉及抛出一个不存在的异常类型,所以如果 constexpr 函数没有被删除,你会得到一个链接器错误,但听说这只适用于一些编译器。
【问题讨论】:
-
一种可能的解决方案:您严格按照
template <...> struct xyz { static constexpr long long value=...; }实现该功能。不,真的,我的意思是不要使用constexpr function,而是严格在结构模板中实现计算。 -
请注意,人们普遍认为,如果知道你的算法足以让它被破解,那么你的算法就是垃圾。
-
对于可能遇到此问题并想尝试一下的人来说,这是一个很好的一般性评论,但我的需求与安全无关。
-
在构建系统中简单地运行算法并将其值导出到程序可能更容易且更易于维护。在 CMake 中,这将是
config_file()。这样一来,您的算法就根本不在编译后的代码中。