将哈希算法从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)