Invalit sal en bcrypt cuando checkpw -- python campo con flask campo con bcrypt camp Relacionados El problema

Invalit salt in bcrypt when i checkpw


0
vote

problema

Español

Trabajando con Flask Python. Cuando intento comparar la contraseña hash cifrada con bcrypt.hashpw () Diga la sal no válida.

Ahora lo pruebo y, si pongo esto, STUCK WOKS, pero solo si está en el campo de la contraseña en el formulario HTML, pegue la contraseña ha sido hecha (la cosa es que necesito poner la contraseña normal) Entonces, la comparación, está bien, el Formulario Fiel en HTML y la conexión a la DB para tomar la contraseña de usuario, funciona, solo falla cuando necesito poner bcrypt.checkpw (contraseña_in_the_login_form.html, contraseña_hashed_in_the_db) Que dice que la sal no válida cada vez, aquí mi código:

  app.config['MYSQL_HOST'] = 'localhost' app.config['MYSQL_USER'] = 'root' app.config['MYSQL_PASSWORD'] = '01b0cfa6c076da9264d7ea8b44967445' app.config['MYSQL_DB'] = 'flaskdb' app.config['MYSQL_CURSORCLASS'] = 'DictCursor' mysql = MySQL(app)  @app.route('/login', methods=['GET', 'POST']) def login():     if request.method == 'POST':         email = request.form['Email']         password = request.form['Password']          curl = mysql.connection.cursor(MySQLdb.cursors.DictCursor)         curl.execute("SELECT * FROM users WHERE Email=%s",(email,))         user = curl.fetchone()                  if len(user) > 0:             if user["Password"] == password:                                session['Email'] = email                 session['Nickname'] = user["Nickname"]                 return render_template("profile.html")             else:                 return "Error password and email not match"         else:             return "Error user not found"     else:         return render_template("login.html")     @app.route('/logout') def logout():     session.clear()     return redirect(url_for("home"))   @app.route("/signup", methods=["GET", "POST"])        def signup():     if request.method == 'GET':         return render_template("signup.html")     else:         nickname = request.form['Nickname']         firstName = request.form['First_Name']         lastName = request.form['Last_Name']         email = request.form['Email']         password = request.form['Password'].encode('utf-8')                  hash_password = bcrypt.hashpw(password, bcrypt.gensalt(14))          cur = mysql.connection.cursor()         cur.execute("INSERT INTO users (Nickname, First_Name, Last_Name,          Email, Password) VALUES (%s,%s,%s,%s,%s)",(nickname,firstName,lastName,email,hash_password,))         mysql.connection.commit()         return redirect(url_for('home'))  if __name__ == '__main__':     app.secret_key = 'bb8ef1d0a8de0bf09b4b2aaee861a7d5'     app.run(debug=True)   

y las formas HTML

      <form action="/signup" method="POST">     <input type="text" class="form-field" name="Nickname" placeholder="Nickname">     <input type="text" class="form-field" name="First_Name" placeholder="First Name">     <input type="text" class="form-field" name="Last_Name" placeholder="Last Name">     <input type="email" class="form-field" name="Email" placeholder="Email">     <input type="password" class="form-field" name="Password" placeholder="Password">     <button type="submit" class="signup-btn">SIGNUP</button>     </form>  <form action="/login" method="POST">   <input type="email" class="form" name="Email"><br>   <input type="password" class="form" name="Password"><br>   <button type="submit" class="login-btn">LOGIN</button> </form>   
Original en ingles

Working with flask python. When i try to compare the hashed password encrypted with bcrypt.hashpw() say invalid salt.

Now i test it and if i put this if statement woks but only if in the password field in the html form i paste the password hashed (the thing is that i need to put the normal password) So the comparation i ok the form fiel in html and the connection to the db to take the user password works only fails when i need to put bcrypt.checkpw(password_in_the_login_form.html, password_hashed_in_the_db) That says Invalid Salt every time, here my code:

app.config['MYSQL_HOST'] = 'localhost' app.config['MYSQL_USER'] = 'root' app.config['MYSQL_PASSWORD'] = '01b0cfa6c076da9264d7ea8b44967445' app.config['MYSQL_DB'] = 'flaskdb' app.config['MYSQL_CURSORCLASS'] = 'DictCursor' mysql = MySQL(app)  @app.route('/login', methods=['GET', 'POST']) def login():     if request.method == 'POST':         email = request.form['Email']         password = request.form['Password']          curl = mysql.connection.cursor(MySQLdb.cursors.DictCursor)         curl.execute("SELECT * FROM users WHERE Email=%s",(email,))         user = curl.fetchone()                  if len(user) > 0:             if user["Password"] == password:                                session['Email'] = email                 session['Nickname'] = user["Nickname"]                 return render_template("profile.html")             else:                 return "Error password and email not match"         else:             return "Error user not found"     else:         return render_template("login.html")     @app.route('/logout') def logout():     session.clear()     return redirect(url_for("home"))   @app.route("/signup", methods=["GET", "POST"])        def signup():     if request.method == 'GET':         return render_template("signup.html")     else:         nickname = request.form['Nickname']         firstName = request.form['First_Name']         lastName = request.form['Last_Name']         email = request.form['Email']         password = request.form['Password'].encode('utf-8')                  hash_password = bcrypt.hashpw(password, bcrypt.gensalt(14))          cur = mysql.connection.cursor()         cur.execute("INSERT INTO users (Nickname, First_Name, Last_Name,          Email, Password) VALUES (%s,%s,%s,%s,%s)",(nickname,firstName,lastName,email,hash_password,))         mysql.connection.commit()         return redirect(url_for('home'))  if __name__ == '__main__':     app.secret_key = 'bb8ef1d0a8de0bf09b4b2aaee861a7d5'     app.run(debug=True) 

And the html forms

    <form action="/signup" method="POST">     <input type="text" class="form-field" name="Nickname" placeholder="Nickname">     <input type="text" class="form-field" name="First_Name" placeholder="First Name">     <input type="text" class="form-field" name="Last_Name" placeholder="Last Name">     <input type="email" class="form-field" name="Email" placeholder="Email">     <input type="password" class="form-field" name="Password" placeholder="Password">     <button type="submit" class="signup-btn">SIGNUP</button>     </form>  <form action="/login" method="POST">   <input type="email" class="form" name="Email"><br>   <input type="password" class="form" name="Password"><br>   <button type="submit" class="login-btn">LOGIN</button> </form> 
        
   
   

Lista de respuestas

0
 
vote
vote
La mejor respuesta
 

Es difícil apinar exactamente lo que está equivocado porque carecemos de una mcve y rastros de errores , de todos modos podemos adivinar al menos lo que puede ser la causa.

Línea ficticia

Primero, tiene un problema en esta línea:

  password = b'password'   

Nunca almacenó ninguna contraseña de usuario, en su lugar, todos han sido anulados por el valor bytes1 . Comenta esta línea en su función y podrá almacenar la contraseña de entrada del usuario en lugar de un valor ficticio.

Desafortunadamente, no hay recuperación para la contraseña ya almacenada ya que ha perdido la información original del usuario.

Flujo de trabajo

Luego, podemos confirmar que bcrypt funciona como se esperaba:

  import bcrypt saltp = bcrypt.gensalt(14)                       # b'$2b$14$7QmgF.1F4dTKeb8o8dprEu' hashp = bcrypt.hashpw('abcdef'.encode(), saltp)  # b'$2b$14$7QmgF.1F4dTKeb8o8dprEuo2T2Y908hdZan9fb.LDWDuibPl/SLpm' bcrypt.checkpw('abcdef'.encode(), hashp)         # True   

De este fragmento anterior, debe intentar todos los pasos de su proceso. (Agregue MySQL E / S con contraseñas frescas) para resaltar cuál está causando el problema:

  • contraseña recopilada con configuración regional en el lado del cliente ( str );
  • Contraseña Hashed usando BCRYPT ( bytes ) en el lado del servidor;
  • Passwn Hash almacenado en MySQL (afectado por el primer error, todavía no tenemos ni idea de qué tipo lo almacenó y si debe escapó o no, por favor lee el comentario)
  • hash de contraseña recuperado de MySQL;
  • hash de contraseña en comparación con la entrada del usuario usando bcrypt;

JEPARDY

Mi conjetura: El problema reside entre el matraz y el MySQL, no está almacenando lo que cree que es debido al problema de fundición bytes6 ( 9988777667 ) vs str ( TEXT ). Esto es muy probable por qué tenía que modificar las cosas con password0 , pero puede haber introducido otro error porque no ha escapado su contraseña hashed: probablemente necesite escapar de la contraseña de hash como que está intentando para almacenar datos binarios en un campo de texto .

Mi consejo: En cada paso del flujo de contraseña, marque los valores de la contraseña / hash y confirme que está manejando lo que cree que es. Cuando ocurre una discrepancia, habrá identificado la fuente de un error. Luego lo describe explícitamente en su publicación si aún necesita ayuda.

 

It is difficult to exactly pin out what is going wrong because we lack a MCVE and error traces, anyway we can at least guess what may be the cause.

Dummy line

First, you have a problem at this line:

password = b'password' 

You never stored any user password, instead they all have been overridden by the password value. Comment out this line in your function and you will be able to store user input password instead of a dummy value.

Unfortunately, there is no recovery for already stored password as you have lost the original user information.

Working flow

Then we can confirm that bcrypt works as expected:

import bcrypt saltp = bcrypt.gensalt(14)                       # b'$2b$14$7QmgF.1F4dTKeb8o8dprEu' hashp = bcrypt.hashpw('abcdef'.encode(), saltp)  # b'$2b$14$7QmgF.1F4dTKeb8o8dprEuo2T2Y908hdZan9fb.LDWDuibPl/SLpm' bcrypt.checkpw('abcdef'.encode(), hashp)         # True 

From this snippet above, you should try all steps of your process goes trough (add MySQL I/O with fresh passwords) to highlight which one is causing the issue:

  • Password collected with locale at client side (str);
  • Password hashed using bcrypt (bytes) at server side;
  • Password hash stored in MySQL (affected by the first bug, we still have no clue on what type you stored it and if it must escaped or not, please read comment)
  • Password hash retrieved from MySQL;
  • Password hash compared against user input using bcrypt;

Jeopardy

My guess: the problem resides between Flask and MySQL, you are not storing what you think it is because of casting problem bytes (BLOB) vs str (TEXT). This is most likely why you had to tweak things with user["Password"].encode('utf-8') but it may have introduced another bug because you haven't escaped your hashed password: you probably need to escape hashed password as you are trying to store binary data in a text field.

My advise: at every step of the password flow, check password/hash values and confirm you are handling what you think it is. When a discrepancy occurs, you will have identified the source of a bug. Then explicitly describe it in your POST if you still need help.

 
 
     
     
0
 
vote

gracias, pero esto es (creo) exactamente lo que tengo. No sé por qué tengo el error que tengo el .hashpw que hash la contraseña y lo almacena en el DB y esto está bien, veo la contraseña en la DB cifrada, pero .CheckPW para comparar la contraseña en el formulario a la contraseña En la base de datos falla, dice que la sal de invalit, el código es exactamente para comparar:

  password111  

Donde la contraseña es la contraseña que el usuario se coloca en el formulario de inicio de sesión ya .ENCODE ('UTF-8') y UserPassWordDB es la contraseña cifrada en la base de datos (necesidad de convertir a UserPasswordDB.ENCODE ('UTF-8') Porque si no lo hago, el depurador dice que necesito codificar antes de comparar)

En el inicio de sesión desde HTML, tengo esto:

  password2  
 

Thanks but this is (i think) exactly what i have. I dont know why i have the error i have the .hashpw that hash the password and store it in the db and this is okay, i see the password in the db encrypted but the .checkpw to compare the password in the form to the password in the database fails, says Invalit salt the code is this exactly to compare:

if bcrypt.checkpw(password, userPassworddb): 

Where password is the password that the user put in the login form with already .encode('utf-8') and userPassworddb is the password encrypted in the database (need too convert userPassworddb.encode('utf-8') cause if i dont do it the debugger says that i need to encode before comparing)

In the login from in html i have this:

<form action="/login" method="POST">   <input type="email" class="form" name="Email"><br>   <input type="password" class="form" name="Password"><br>   <button type="submit" class="login-btn">LOGIN</button> </form> 
 
 
 
 

Relacionados problema

0  ¿Es esta función de inicio de sesión sin fallas?  ( Is this a no fault login function ) 
Hola, todo lo que me gustaría sus puntos de vista sobre si la función que he creado a continuación es una función de inicio de sesión sin fallas. Estoy usando...

11  Comparar contraseñas bcryptjs  ( Compare passwords bcryptjs ) 
Así que estoy tratando de construir un inicio de sesión de usuario muy básico. Estoy tratando de crear un usuario, luego iniciar sesión con esas credenciales ...

1  Siga el error de solicitud en Heroku  ( Keep getting application error on heroku ) 
Desde la última confirmación que hice a Heroku siempre que intento acceder a mi solicitud, sigo recibiendo este error ", no se produjo un error en la aplicaci...

5  ¿Hay algún algoritmo de hash de JavaScript lento como BCIRYPT?  ( Are there any slow javascript hashing algorithms like bcrypt ) 
No estoy hablando de Nede.js del lado del servidor. Quiero usar un algoritmo de hashing lento para una llave en el lado del cliente de mi sitio. He encont...

2  yo mismo! Produce un error de argumento # <ArgumentError: Número incorrecto de argumentos (0 para 2)>  ( Self save produces an argument error argumenterror wrong number of arguments ) 
Estoy sobrescribiendo la función Valid_Password de Devise con el Follwing: def valid_password?(password) if legacy_password? return false unless ...

2  pbkdf2 vs bcrypt, rondas?  ( Pbkdf2 vs bcrypt rounds ) 
Tengo una pregunta tonta (y probablemente ya se ha preguntado): Las personas siempre se comparan entre bcrypt y pbkdf2 y dicen que bcrypt es mejor por...

0  Ror - rubygems que no se instalan?  ( Ror rubygems not installing ) 
Tratando de instalar BCIRYPT-RUBY-2.1.4. Tengo que usar RVM para eliminar Ruby 1.9.2, luego reinstalar / compilar, entonces puedo instalar la gema BCIPTP, sin...

1  error de instalación de ruby ​​bcrypt en OSX  ( Ruby bcrypt install error on osx ) 
Intenté ejecutar 'Sudo GEM Instalar BCIRYPT-RUBY' y obtuve el siguiente error: Extensiones nativas de construcción. Esto podría tomar un tiempo ... Err...

6  Los rieles 4 'has_secure_password' validan una contraseña en blanco y no pueden realizar validaciones condicionales  ( Rails 4 has secure password validates a blank password and cannot perform cond ) 
Soy consciente de que has_secure_password agrega validaciones para contraseña y contraseña_confirmación en: crear acción. Cuando crea un nuevo usuario, debe...

0  Nodo JS espera el bucle para terminar  ( Node js wait for loop to finish ) 
Estoy tratando de devolver una lista de eventos que les gustó un determinado usuario, pero la matriz devuelta por el código parece estar siempre vacía (la dev...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos