Skip to main content
 首页 » 编程设计

python之类型错误 : must be string or buffer, 不是整数

2025年05月04日11shanyou

我正在尝试通过密码加密解决 Rainbow Tables 问题,并且只做到了这一点。

import sys 
import random 
import hashlib 
 
def mt_rand (low = 0, high = sys.maxint): 
    """Generate a better random value 
    """ 
    return random.randint (low, high) 
 
def substr (s, start, length = None): 
    """Returns the portion of string specified by the start and length 
    parameters. 
    """ 
    if len(s) >= start: 
        return False 
    if not length: 
        return s[start:] 
    elif length > 0: 
        return s[start:start + length] 
    else: 
        return s[start:length] 
 
def unique_salt(): 
    return substr(hashlib.sha1(mt_rand()),0,22) 
 
password = "12345" 
salt = unique_salt() 
hash = hashlib.sha1(salt + password).hexdigest() 
print(hash) 

我收到这个错误:

Traceback (most recent call last): 
  File "C:/Users/Ajay/PycharmProjects/itertools/test.py", line 27, in <module> 
    salt = unique_salt() 
  File "C:/Users/Ajay/PycharmProjects/itertools/test.py", line 24, in unique_salt 
    return substr(hashlib.sha1(mt_rand()),0,22) 
TypeError: must be string or buffer, not int 

我知道我遗漏了一些非常微不足道的东西,但无法找到我遗漏的地方。 请帮忙。

请您参考如下方法:

hashlib.sha1接受一个字符串作为参数。

>>> import hashlib 
>>> hashlib.sha1('asdf') 
<sha1 HASH object @ 0000000002B97DF0> 

但是您正在传递一个 int 对象。 (random.randint的返回值顾名思义就是int对象)

>>> hashlib.sha1(1234) 
Traceback (most recent call last): 
  File "<stdin>", line 1, in <module> 
TypeError: must be string or buffer, not int 

您可以使用 os.urandom生成随机字符串:

>>> import os 
>>> hashlib.sha1(os.urandom(10)) # `os.urandom(10)` generate 10-bytes random string. 
<sha1 HASH object @ 0000000002B97F30> 
>>> hashlib.sha1(os.urandom(10)).digest() 
'\x0c.y\x08\x13\xf0\x16.\xea\x05\x03\x07{6H\xa0U\xfe\xdfT' 
>>> hashlib.sha1(os.urandom(10)).hexdigest() 
'6e33d9cfdbd7ffcf062ee502eaa25893f618fcff'