【问题标题】:TypeError: must be string or buffer, not intTypeError:必须是字符串或缓冲区,而不是 int
【发布时间】:2014-01-15 05:33:26
【问题描述】:

我正在尝试通过密码加密解决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 需要对字符串进行哈希处理,但您输入了一个整数。你想散列什么?
  • 我想对密码进行哈希处理,即string
  • unique_salt 函数是干什么用的?
  • @aIKid 我想为每个用户生成一个随机字符串并将其用作唯一的盐。

标签: python cryptography rainbowtable


【解决方案1】:

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'

【讨论】:

  • @ajkumar25, def unique_salt(): return hashlib.sha1(os.urandom())[:22]
  • def unique_salt(): return hashlib.sha1(os.urandom()).hexdigest()[:22]
  • @ajkumar25,哦,你是对的。我在上面的评论中错过了digest/hexdigest
【解决方案2】:

您可以使用 python 的内置函数type 来检查对象。

>>>type(mt_rand())
int
>>>hashlib.sha1(mt_rand())
TypeError: must be string or buffer, not int

这是意料之中的。改为传递 hashlib.sha1 字符串。

>>>hashlib.sha1("password")
<sha1 HASH object @ 0x1c89cb0>

【讨论】:

    【解决方案3】:

    hashlib.sha1 需要一个字符串进行哈希处理,但你输入了一个整数。

    先转成字符串:

    def unique_salt():
        return substr(hashlib.sha1(str(mt_rand())),0,22)
    

    这里有一点演示:

    >>> import hashlib
    >>> import random
    >>> s = random.randint(1, 1000)
    >>> hashlib.sha1(str(s)).digest()
    '\xd1\x84\x01\xb1\xbb7\xc5\xd9)|\xf1o\xc48X\xb4\xfd\xb3x%'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-02-28
      • 1970-01-01
      • 1970-01-01
      • 2019-02-17
      相关资源
      最近更新 更多