将哈希算法从C转换为Python 我的客户是一个Python程序员,我为他创建了一个C++后端,包括许可证生成和检查。为了增加安全性,Python前端还将执行许可证的有效性检查
然而,许可证生成和检查算法基于散列方法,散列方法依赖于一个整数具有固定字节大小,并且对值进行位移位不会扩展整数字节计数 这是一个简化的示例代码:将哈希算法从C转换为Python 我的客户是一个Python程序员,我为他创建了一个C++后端,包括许可证生成和检查。为了增加安全性,Python前端还将执行许可证的有效性检查,python,c,algorithm,hash,code-translation,Python,C,Algorithm,Hash,Code Translation,然而,许可证生成和检查算法基于散列方法,散列方法依赖于一个整数具有固定字节大小,并且对值进行位移位不会扩展整数字节计数 这是一个简化的示例代码: unsigned int HashString(const char* str) { unsigned int hash = 3151; while (*str != 0) { hash = (hash << 3) + (*str << 2) * 3; str++; }
unsigned int HashString(const char* str) {
unsigned int hash = 3151;
while (*str != 0) {
hash = (hash << 3) + (*str << 2) * 3;
str++;
}
return hash;
}
编辑:PHP也需要这样做,因为在线商店也应该能够生成有效的许可证。用
和屏蔽哈希值:
def hash_string(str, _width=2**32-1):
hash = 3151
for c in str:
hash = ((hash << 3) + (ord(c) << 2) * 3)
return hash & _width
用和屏蔽哈希值:
def hash_string(str, _width=2**32-1):
hash = 3151
for c in str:
hash = ((hash << 3) + (ord(c) << 2) * 3)
return hash & _width
这里的问题是,C的unsigned int
在经过UINT\u MAX
时会自动滚动,而Python的int
则会不断变大
最简单的修复方法就是在最后进行纠正:
return hash % (1 << 32)
returnhash%(1这里的问题是C的unsigned int
在经过UINT_MAX
时会自动滚动,而Python的int
只是不断变大
最简单的修复方法就是在最后进行纠正:
return hash % (1 << 32)
return hash%(1)一个警告:char
是不明确的:有符号还是无符号?。应该将C代码更改为显式;例如,const unsigned char*str
@NiklasR:这是非常简单的保护。任何能够破解二进制DLL并插入其新版本的人都可以破解Python源代码。(这在某些情况下可能仍然有用,只要你知道你从中得到的东西有多少。)@TimPeters:这一点很好。或者在你访问它的地方播放*str
,而不是尽可能地传播已注册的内容,直到你添加到(散列代码看起来也是“虚构的”)-可能不好。例如,除非字符串为空,否则哈希的最后两位始终为0。@TimPeters:另一个好的观点。复制保护的标准技巧是使用类似HMAC-SHA1的东西,并在代码中混淆键/盐。(真的,除非你能很好地隐藏密钥,使其比破解算法更难找到,否则它不一定是一个好的算法……但使用标准技巧可以更容易地证明破解密钥的人一定违反了DMCA或你的合同条款。)一个警告:char
是不明确的:有符号的还是无符号的?。应该将C代码更改为显式的;例如,const unsigned char*str
@NiklasR:这是非常简单的保护。任何能够破解二进制DLL并插入其新版本的人都可以破解Python源代码。(这在某些情况下可能仍然有用,只要你知道你从中得到的东西有多少。)@TimPeters:这一点很好。或者在你访问它的地方播放*str
,而不是尽可能地传播已注册的内容,直到你添加到(散列代码看起来也是“虚构的”)-可能不好。例如,除非字符串为空,否则哈希的最后两位始终为0。@TimPeters:另一个好的观点。复制保护的标准技巧是使用类似HMAC-SHA1的东西,并在代码中混淆键/盐。(真的,除非你能很好地隐藏密钥,使其比破解算法更难找到,否则它不一定是一个好的算法……但使用标准技巧可以更容易地证明破解密钥的人一定违反了DMCA或你的合同条款。)
return hash % (1 << 32)