【发布时间】:2013-09-23 19:35:03
【问题描述】:
我的客户是一名 Python 程序员,我为他创建了一个 C++ 后端,其中包括许可证生成和检查。为了提高安全性,Python 前端还将执行许可证的有效性检查。
然而,许可证生成和检查算法基于散列方法,该方法依赖于整数具有固定字节大小的事实,并且对值进行位移不会扩展整数字节数。
这是一个简化的示例代码:
unsigned int HashString(const char* str) {
unsigned int hash = 3151;
while (*str != 0) {
hash = (hash << 3) + (*str << 2) * 3;
str++;
}
return hash;
}
如何将其转换为 Python?直接翻译显然会产生不同的结果:
def hash_string(str):
hash = 3151
for c in str:
hash = (hash << 3) + (ord(c) << 2) * 3
return hash
例如:
hash_string("foo bar spam") # 228667414299004
HashString("foo bar spam") // 3355459964
编辑:PHP 也需要这样做,因为在线商店也应该能够生成有效的许可证。
【问题讨论】:
-
一个警告:
char不明确:有符号还是无符号? See here。应该将 C 代码更改为显式;即const unsigned char* str. -
@NiklasR:这是非常微不足道的保护。任何可以破解您的二进制 DLL 并放入他的新版本的人大概也可以破解您的 Python 源代码。 (这在某些情况下可能仍然有用,只要您知道自己从中得到了多少。)
-
@TimPeters:好点。或者只是在你访问它的地方投射
*str,而不是尽可能地传播东西——注册直到你添加到(hash << 3)。 -
哈希码看起来也是“编造的”——可能不太好。例如,除非字符串为空,否则哈希的最后两位始终为 0。
-
@TimPeters:另一个好点。复制保护的标准技巧是使用 HMAC-SHA1 之类的东西,并在代码中混淆密钥/盐。 (真的,除非你能很好地隐藏密钥以至于它比算法破解更难找到,否则它不一定是一个好的算法......但是使用标准技巧可以更容易地证明任何破解它的人都必须违反了 DMCA 或您的合同条款。)
标签: python c algorithm hash code-translation