每次服务器启动时,Salt的初始化都不同,这会给python瓶子和sqlite3中的凭据数据库带来麻烦

每次服务器启动时,Salt的初始化都不同,这会给python瓶子和sqlite3中的凭据数据库带来麻烦,python,sqlite,hash,credentials,salt,Python,Sqlite,Hash,Credentials,Salt,首先,我将Python瓶子与Sqlite3一起使用。我遇到的问题是,当我在程序开始时初始化salt,然后停止程序并重新启动它时,整个过程都会中断,因为它会生成不同的salt。因此,当我重新启动程序时,我无法使用任何旧帐户登录,也无法使用相同的名称创建用户,因为它们仍然存储在凭据数据库中 盐: salt = uuid.uuid4().hex 散列: hashed_password = hashlib.sha512(passwordInput + salt).hexdigest() 我正在用支票

首先,我将Python瓶子与Sqlite3一起使用。我遇到的问题是,当我在程序开始时初始化salt,然后停止程序并重新启动它时,整个过程都会中断,因为它会生成不同的salt。因此,当我重新启动程序时,我无法使用任何旧帐户登录,也无法使用相同的名称创建用户,因为它们仍然存储在凭据数据库中

盐:

salt = uuid.uuid4().hex
散列:

hashed_password = hashlib.sha512(passwordInput + salt).hexdigest()
我正在用支票核实帐目

row = (c.execute("SELECT * FROM Credentials WHERE usernameDB =? AND passhashDB =?", (usernameInput,  hashed_password, ))).fetchone()
if row: 
等等


我应该如何着手解决这个问题?

如果所有帐户都有相同的帐户,它将无法防止为该盐计算的彩虹表。 每个用户必须有自己的盐

salt与密码散列一起存储在数据库中。 (盐本身未加密存储不是问题;您需要再次使用它来检查散列。)

大概是这样的:

def new_user(name, password):
    salt = uuid.uuid4().hex
    hash = hashlib.sha512(password + salt).hexdigest()
    c.execute("INSERT INTO Credentials(usernameDB,passhashDB,salt) VALUES(?,?,?)",
              (name, hash, salt))

def check_login(name, password):
    c.execute("SELECT salt, passhashDB FROM Credentials WHERE usernameDB = ?",
              (name,))
    for row in c:
        salt = row[0]
        actual_hash = row[1]
        input_hash = hashlib.sha512(password + salt).hexdigest()
        if input_hash != actual_hash:
            raise Exception("invalid password")
    else:
        raise Exception("invalid user name")

如果所有帐户都具有相同的属性,它将无法针对针对该盐计算的彩虹表进行保护。 每个用户必须有自己的盐

salt与密码散列一起存储在数据库中。 (盐本身未加密存储不是问题;您需要再次使用它来检查散列。)

大概是这样的:

def new_user(name, password):
    salt = uuid.uuid4().hex
    hash = hashlib.sha512(password + salt).hexdigest()
    c.execute("INSERT INTO Credentials(usernameDB,passhashDB,salt) VALUES(?,?,?)",
              (name, hash, salt))

def check_login(name, password):
    c.execute("SELECT salt, passhashDB FROM Credentials WHERE usernameDB = ?",
              (name,))
    for row in c:
        salt = row[0]
        actual_hash = row[1]
        input_hash = hashlib.sha512(password + salt).hexdigest()
        if input_hash != actual_hash:
            raise Exception("invalid password")
    else:
        raise Exception("invalid user name")

你为什么要创造一种新的盐呢?只需创建一次,并将其作为文本字符串写入即可。@DanielRoseman这不是使用salt的正确方法,应该为每个帐户创建一个salt,但应与该帐户一起保留。@LasseV.Karlsen你是对的,当然,我把它与一个站点范围的秘密混淆了。你为什么要创建一个新的salt?只需创建一次,并将其作为文本字符串写入即可。@DanielRoseman这不是使用salt的正确方法,应该为每个帐户创建一个salt,但保留该帐户。@LasseV.Karlsen您是对的,当然,我把它与站点范围的秘密混淆了。因此有两个问题:1)在程序开始时,每次我在hash_密码初始化中调用salt时,它会创建不同的salt吗?如果不是,我是否应该将salt初始化移到
def createAccount
函数中?第二点:为什么盐没有加密不是问题?我把密码解密错了吗?因为每次我再次启动程序时,hash_密码中的salt和我测试它的另一个hash_密码中的salt都是不同的。所以有两个问题:1)在程序的最开始,每次我在hash_密码初始化中调用salt,它会创建不同的salt吗?如果不是,我是否应该将salt初始化移到
def createAccount
函数中?第二点:为什么盐没有加密不是问题?我把密码解密错了吗?因为hash_密码中的salt和我测试它的另一个hash_密码在每次我再次启动程序时都是不同的。