Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1

    Hasing è password con jBCrypt

    ciao!

    sto cercando di simulare il login, e devo confrontare l'hash (in teoria) salvato sul db con quello inviato dall'uitente.

    ho fatto una prova banale:
    codice:
    private String testPwd = BCrypt.hashpw("123456789", BCrypt.gensalt(12));
    
    public void doLogin(View view) {
        String passwordTxt = password.getText().toString();
        String hashed = BCrypt.hashpw(passwordTxt, BCrypt.gensalt(12));
    
        Log.i("PWD", passwordTxt);
        if (BCrypt.checkpw(passwordTxt, hashed)) {
            Log.i("OK", "OK");
        } else {
            Log.i("KO", "KO");
        }
    }
    il problema è che mi esce OK qualsiasi cosa scriva nella casella di testo.
    probabilmente non sto capendo io come usare la libreria.
    qualcuno ha un suggerimento??

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,303
    Beh... stai confrontando sempre la password letta dalla casella di testo con il suo hash (sarà sempre vero!).
    Fose volevi confrontarlo con testPwd e non con hashed (che tra l'altro non ti dovrebbe servire di calcolare).

    codice:
    if ( BCrypt.checkpw(passwordTxt, testPwd) ) {

    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  3. #3
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da fermat Visualizza il messaggio
    sto cercando di simulare il login, e devo confrontare l'hash (in teoria) salvato sul db con quello inviato dall'uitente.

    il problema è che mi esce OK qualsiasi cosa scriva nella casella di testo.
    probabilmente non sto capendo io come usare la libreria.
    qualcuno ha un suggerimento??
    Il bcrypt genera sempre ogni volta un hash differente, anche a fronte della stessa pw in chiaro. Funziona così.
    Il punto è che solo l'algoritmo del bcrypt "sa" come confrontare (il modo lui ce l'ha) una password "in chiaro" con un hash pre-generato (NON si possono banalmente confrontare 2 hash!).

    Questo in sostanza vuol dire che:
    - BCrypt.hashpw lo devi usare solo quando generi l'utenza es. su DB, cioè quando scrivi il record con dentro l'hash della password (o se si aggiorna la password). Poi hashpw non lo devi più usare per questa utenza.
    - BCrypt.checkpw lo devi usare solo quando vuoi autenticare una password, passando la password in chiaro inserita dall'utente e l'hash che hai tirato su dal record utente.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  4. #4
    scusate, sono fuso io.
    facevo un confronto sbagliato.
    questo sembra funzionare.
    solo per fare dei test di login senza avere le API remote.
    poi sarà da modificare.


    codice:
    private String testPwd = BCrypt.hashpw("123456789", BCrypt.gensalt(12));
    
    public void doLogin(View view) {
        String rfidTxt = rfid.getText().toString();
        String usernameTxt = username.getText().toString();
        String passwordTxt = password.getText().toString();
    
        if (TextUtils.isEmpty(rfidTxt) || TextUtils.isEmpty(usernameTxt) || TextUtils.isEmpty(passwordTxt)) {
            GenericToast.viewToast(getApplicationContext(), "Tutti i campi sono obbligatori", Toast.LENGTH_LONG, Gravity.CENTER);
        } else {
            if (usernameTxt.equals("email@email.com") && BCrypt.checkpw(passwordTxt, testPwd) && rfidTxt.equals("12345")) {
                Intent intent = new Intent(this, HomeActivity.class);
                startActivity(intent);
            } else {
                GenericToast.viewToast(getApplicationContext(), "Username, password o rfid errati!", Toast.LENGTH_LONG, Gravity.CENTER);
            }
        }
    }

  5. #5
    allora, non capisco bene perchè mi da errore.

    allora:
    codice:
    public void doLogin(View view) {
        rfidTxt = rfid.getText().toString().trim();
        usernameTxt = username.getText().toString().trim();
        passwordTxt = password.getText().toString().trim();
    
        if (TextUtils.isEmpty(rfidTxt) || TextUtils.isEmpty(usernameTxt) || TextUtils.isEmpty(passwordTxt)) {
            GenericToast.viewToast(getApplicationContext(), "Tutti i campi sono obbligatori", Toast.LENGTH_LONG, Gravity.CENTER);
        } else {
            try (BindMyDataSource dataSource = BindMyDataSource.open()) {
                Users u = dataSource.usersDao.login(usernameTxt, rfidTxt);
                if (u == null) {
                    GenericToast.viewToast(getApplicationContext(), "Username, password o rfid errati!", Toast.LENGTH_LONG, Gravity.CENTER);
                } else {
                    Log.e("USER", u.hashedPassword);
                    if (BCrypt.checkpw(passwordTxt, u.hashedPassword)) {
                        Log.e("USER", "OK");
                    } else {
                        GenericToast.viewToast(getApplicationContext(), "Username, password o rfid errati!", Toast.LENGTH_LONG, Gravity.CENTER);
                    }
                }
            }
        }
    }
    in pratica arrivo al Log.e e mi da il valore di u.hashedPassword, però poi va in errore:
    codice:
    2020-02-03 11:03:18.902 26227-26227/com.easytrack.app E/USER: $2y$12$OPE8ACrZuoe5okYxlnCI2eD11F5n8F1xPmf26n3g9OBqFqvCIlHMm
    2020-02-03 11:03:18.907 26227-26227/com.easytrack.app E/AndroidRuntime: FATAL EXCEPTION: main
        Process: com.easytrack.app, PID: 26227
        java.lang.IllegalStateException: Could not execute method for android:onClick
            at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:402)
            at android.view.View.performClick(View.java:6669)
            at android.view.View.performClickInternal(View.java:6638)
            at android.view.View.access$3100(View.java:789)
            at android.view.View$PerformClick.run(View.java:26145)
            at android.os.Handler.handleCallback(Handler.java:873)
            at android.os.Handler.dispatchMessage(Handler.java:99)
            at android.os.Looper.loop(Looper.java:193)
            at android.app.ActivityThread.main(ActivityThread.java:6898)
            at java.lang.reflect.Method.invoke(Native Method)
            at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:537)
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
         Caused by: java.lang.reflect.InvocationTargetException
            at java.lang.reflect.Method.invoke(Native Method)
            at androidx.appcompat.app.AppCompatViewInflater$DeclaredOnClickListener.onClick(AppCompatViewInflater.java:397)
            at android.view.View.performClick(View.java:6669) 
            at android.view.View.performClickInternal(View.java:6638) 
            at android.view.View.access$3100(View.java:789) 
            at android.view.View$PerformClick.run(View.java:26145) 
            at android.os.Handler.handleCallback(Handler.java:873) 
            at android.os.Handler.dispatchMessage(Handler.java:99) 
            at android.os.Looper.loop(Looper.java:193) 
            at android.app.ActivityThread.main(ActivityThread.java:6898) 
            at java.lang.reflect.Method.invoke(Native Method) 
            at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:537) 
            at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858) 
         Caused by: java.lang.IllegalArgumentException: Invalid salt revision
            at org.mindrot.jbcrypt.BCrypt.hashpw(BCrypt.java:665)
            at org.mindrot.jbcrypt.BCrypt.checkpw(BCrypt.java:764)
            at com.easytrack.app.LoginActivity.doLogin(LoginActivity.java:93)

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da fermat Visualizza il messaggio
    allora, non capisco bene perchè mi da errore.

    codice:
         Caused by: java.lang.IllegalArgumentException: Invalid salt revision
            at org.mindrot.jbcrypt.BCrypt.hashpw(BCrypt.java:665)
            at org.mindrot.jbcrypt.BCrypt.checkpw(BCrypt.java:764)
            at com.easytrack.app.LoginActivity.doLogin(LoginActivity.java:93)
    A vedere così, mi viene una domanda spontanea: dove e come generi l'hash che scrivi su db? Ovvero QUI stai facendo una autenticazione per il login ma molto prima ci sarà stato "qualcosa" che ha registrato l'utente.
    Bene, in quel punto/momento lì, come viene generato l'hash?
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  7. #7
    Quote Originariamente inviata da andbin Visualizza il messaggio
    A vedere così, mi viene una domanda spontanea: dove e come generi l'hash che scrivi su db? Ovvero QUI stai facendo una autenticazione per il login ma molto prima ci sarà stato "qualcosa" che ha registrato l'utente.
    Bene, in quel punto/momento lì, come viene generato l'hash?
    ciao!

    l'hash viene generato sul server, e passato tramite API e salvato nel db locale prima di effettuare il login.
    poi dopo c'è il login dell'utente, che va a cercare tra gli utenti passati tramite API.

    in pratica dall'API mi arriva questo:
    codice:
    "users": [
        {
            "id": 99,
            "userName": "user",
            "hashedPassword": "$2y$12$OPE8ACrZuoe5okYxlnCI2eD11F5n8F1xPmf26n3g9OBqFqvCIlHMm",
            "rfid": "000000099",
        },
        {
            "id": 100,
            "userName": "user2",
            "hashedPassword": "$2y$12$OPE8ACrZuoe5okYxlnCI2eD11F5n8F1xPmf26n3g9OBqFqvCIlHMm",
            "rfid": "000000098",
        }
    ],
    prima controllo l'accoppiata username/rfid passati dall'utente.
    se sono corretti, prendo lo user dal db locale e faccio il confronto della password.
    quando metto le credenziali corrette, mi mostra l'hash nel log.
    è dopo che va in errore.

  8. #8
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da fermat Visualizza il messaggio
    l'hash viene generato sul server
    Come? Sempre con jBCrypt ... o altro?

    Vedi: https://github.com/djmdjm/jBCrypt/issues/2
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

  9. #9
    Quote Originariamente inviata da andbin Visualizza il messaggio
    Come? Sempre con jBCrypt ... o altro?

    Vedi: https://github.com/djmdjm/jBCrypt/issues/2
    non saprei, devo chiedere a chi ha scritto l'API.
    mi è solo stato indicato solo questo:
    codice:
     l’algoritmo utilizzato per generare l’hash delle password è bcrypt. 
    se esistess un'altra libreria / metodo per Java andrebbe bene cmq!

  10. #10
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,254
    Quote Originariamente inviata da fermat Visualizza il messaggio
    codice:
     l’algoritmo utilizzato per generare l’hash delle password è bcrypt. 
    se esistess un'altra libreria / metodo per Java andrebbe bene cmq!
    Devi usare una libreria Java che tratti gli hash bcrypt nella stessa forma di quelli generati lato server. Ma non ti so aiutare in questa ricerca ora.
    La jBCrypt è evidente che non è compatibile con la forma degli hash generati (la issue linkata lo spiega bene).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.