溢出错误:无法将“int”放入索引大小的整数中

Nel*_*n M 3 python flask flask-sqlalchemy

为了确保密码总是在数据库中存储、散列和加盐,我决定使用一个描述符,当提供密码时,它会自动散列密码,例如 user.password = "jinja125"。

这是我的代码

from random import SystemRandom
from backports.pbkdf2 import pbkdf2_hmac, compare_digest

# ...snip...    

@password.setter
def password(self, value):
    # When a user is first created, give them a salt
    if self._salt is None:
        self._salt = bytes(SystemRandom().getrandbits(128))
    self._password = self._hash_password(value)
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试运行一些测试时,出现此错误。

File "C:\Users\User\flask-python\site-tracker\app\users\models.py", line 34, in password
    self._salt = bytes(random.SystemRandom().getrandbits(simple_bit_counts))
OverflowError: cannot fit 'int' into an index-sized integer
Run Code Online (Sandbox Code Playgroud)

我怎样才能最好地解决这个错误?

Jea*_*bre 5

文档

random.getrandbits(k) 返回一个带有k 个随机位的 python long int 。

这里k==128如此1<<128

检查您尝试从中创建bytes数组的大小值(例如):

>>> random.SystemRandom().getrandbits(128)
135192632488754159854542557748438253357
Run Code Online (Sandbox Code Playgroud)

这对于数组索引来说太大了,更不用说内存了。您可能希望大幅降低您的价值。我想你的意思是2**7(7位随机)不是1<<128

现在,如果您想生成 128 个随机字节,您可以这样做:

>>> bytes(random.randrange(0,255) for _ in range(128))
b'\xc9\x8fC\t\xe0\xc8\x8a5\xe4\xafb\xb5c.\x91\xea\x9aqUL\x11\x8d\xe4\xe3W\x87\xecM\xf8K\xa8\xf8\xbb\xb5 \x14H\xda\x1d]L\x13[n*\x87W\xd8\x90v\xfd\x8cQ\xdcY\xe4^\x95h8\xdc\'\x8e\xcb:\xea\xfbF\xf1zh8\xf63\x18WeV\xc6)\xce\xf9*w>\x83e\x0b#"\xf2\x97\xcf\xc2!\xddj\xb2\xbePl\xa2\r\xa7T\x8f\x14\x13\xa4\x1c\xeax\xacMJ2\x88A,\x11\xdev\xe1\xf8\x9b\x12\xd9c'
Run Code Online (Sandbox Code Playgroud)

没有必要要求getrandbits。正如 Amadan 所指出的,也许您想要 128 位,而不是字节,所以range(16)改为使用它。好了,现在您知道了,您可以根据自己的实际需要进行调整。

  • 这在 Python3 中也有效:`SystemRandom().getrandbits(128).to_bytes(16, 'little')`,与 OP 的最初想法保持一点接近。(另请注意,128 个随机 _bits_ 是 _16_ 个随机字节,而不是 128) (2认同)