2016-05-10 3 views
1

J'ai généré un hachage SHA-1 en utilisant Dancer2 :: Plugin :: passphrase avec le code suivant:Dancer2 Auth :: Extensible Ne pas accepter Hashed Mot de passe

get '/generate' => { 
    my $phrase = passphrase('my_password')->generate({ algorithm => 'SHA-1'}); 
    return $phrase->rfc2307(); 
}; 

Le résultat ressemble à ceci:

{SSHA}+2Dro1/ntPchT93mgvYMKGjdzy+XKXK1agsG3//hKuLNrQAK 

et c'est ce que je stocke dans ma base de données PostgreSQL.

J'utilise Dancer2 :: Plugin :: Auth :: Extensible comme ma solution de connexion, mais je n'ai pas encore le faire fonctionner avec des mots de passe cryptés. J'ai mis un compte de test dans ma base de données où nom d'utilisateur = 'test' et mot de passe = 'test', et cela fonctionne bien. Mais le nom d'utilisateur = 'test2' et le mot de passe = '{SSHA} + 2Dro1/ntPchT93mgvYMKGjdzy + XKXK1agsG3 // hKuLNrQAK' ne fonctionnent pas. La page de connexion échoue et recharge automatiquement.

Je me suis retourné sur DBI_TRACE et ne pas vu beaucoup de différence entre les deux, sauf que le compte avec le mot de passe de texte brut retourne ceci:

[glm::App:3515] debug @2016-05-10 21:02:23> users accepted user test in /usr/local/share/perl/5.20.2/Dancer2/Core/Route.pm l. 137 

et le compte des déclarations de mot de passe crypté ceci:

[glm::App:3523] core @2016-05-10 21:04:21> looking for get /login in /usr/local/share/perl/5.20.2/Dancer2/Core/App.pm l. 1210 
[glm::App:3523] core @2016-05-10 21:04:21> Entering hook core.app.before_request in (eval 62) l. 1 
[glm::App:3523] core @2016-05-10 21:04:21> Entering hook core.app.after_request in (eval 62) l. 1 
127.0.0.1 - - [10/May/2016:21:04:21 +0100] "POST /login?return_url=%2F  HTTP/1.1" 401 383 "http://localhost:5000/login?return_url=%2F" "Mozilla/5.0 (X11; Ubuntu; Linux x86_64; rv:41.0) Gecko/20100101 Firefox/41.0" 

Je suis sûr que je manque quelque chose, mais the CPAN page ne détaille pas comment gérer les mots de passe cryptés. Il dit simplement que ce sera facile. Je suppose que je lis cela comme "les mots de passe cryptés seront manipulés automagiquement." Qu'est-ce que je rate?

Config

Ceci est la partie pertinente de ma config

plugins: 
Auth::Extensible: 
    realms: 
     users: 
     provider: 'Database' 
Database: 
    dsn: 'dbi:Pg:service=test' 

App.pm

Voici ce que je fais dans le App.pm. Vous pouvez voir que j'essaie juste d'exiger une connexion pour la page d'accueil. Peut-être que j'ai besoin d'un code '/ login'?

package glm::App; 

use Dancer2; 
use Dancer2::Plugin::Database; 
use Dancer2::Plugin::Auth::Extensible; 
use Dancer2::Plugin::Passphrase; 

use Template; 

our $VERSION = '0.1'; 

get '/' => require_login sub { 
    my $sth = database->prepare('SELECT name FROM product', { RaiseError => 1 }); 
    $sth->execute(); 

    template 'create_list', { 
     'products' => $sth->fetchall_hashref('name'), 
    }; 
}; 

get '/generate'=> sub { 
    my $phrase = passphrase('my_password')->generate({ algorithm => 'SHA-1' }); 
    return $phrase->rfc2307(); # right now I just manually copy and paste this into the database 
}; 

Ma base de données suit le suggested schema pour les utilisateurs, les mots de passe et les rôles.

Peut-être le seul autre peu d'informations pertinentes que je peux penser est que si j'utilise un système de cryptage non reconnu par Digest, je reçois une erreur de Digest.pm. Cela semble indiquer qu'il reconnaît le mot de passe haché et essaie de le déchiffrer, mais pour une raison quelconque, cela ne fonctionne tout simplement pas. Ou ça marche et redirige vers la page d'accueil ... Mais pourquoi ne fait-il pas ça avec 'test, test'?

+0

Pouvez-vous envoyer votre code s'il vous plaît? Si le mot de passe ressemble à un mot de passe crypté, alors DPAE utilise '' 'Crypt :: SaltedHash''' pour le vérifier, il devrait donc fonctionner correctement. Le code pour cela est ici: https://metacpan.org/source/HORNBURG/Dancer2-Plugin-Auth-Extensible-0.502/lib/Dancer2/Plugin/Auth/Extensible/Provider/Base.pm#L88 –

+0

Merci beaucoup pour la réponse. J'ai ajouté tout ce que je pense être pertinent. Faites-moi savoir s'il y a quelque chose d'autre qui pourrait aider. – tmoore82

Répondre

1

TL; DR Vous utilisez deux méthodes différentes pour le hachage, donc les hachages générés sont incompatibles.

Dancer2::Plugin::Auth::Extensible::Provider::Database utilise Crypt :: SaltedHash:

sub encrypt_password { 
    my ($self, $password, $algorithm) = @_; 
    $algorithm ||= 'SHA-1'; 
    my $crypt = Crypt::SaltedHash->new(algorithm => $algorithm); 
    $crypt->add($password); 
    $crypt->generate; 
} 

Cela génère un hachage comme:

{SSHA}qTEaPf8KRPt6XBQXIlQhlWstgBz64coW 

Comparez cela à ce que vous avez obtenu de Dancer2 :: Plugin :: Passphrase:

{SSHA}+2Dro1/ntPchT93mgvYMKGjdzy+XKXK1agsG3//hKuLNrQAK 

Notez que les longueurs sont différentes. Dancer2 :: Plugin :: Passphrase utilise un sel de 16 octets par défaut, tandis que Crypt :: SaltedHash utilise un sel de 4 octets.


Bien que vous pouvez dire Dancer2 :: Plugin :: passphrase utiliser un sel de 4 octets, il est beaucoup plus facile à utiliser juste Crypt :: SaltedHash partout. Le Dancer2 :: Plugin :: Auth :: Extensible documentation explique comment faire:

Un script simple appelé generate-crypted-password pour générer des mots de passe hachés RFC2307 style est inclus, ou vous pouvez utiliser Crypt :: SaltedHash-vous faire Par conséquent, ou utilisez l'utilitaire slappasswd si vous l'avez installé.

Par exemple:

$ generate-crypted-password 
Enter plain-text password ?> foo 
Result: {SSHA}zdXPS0QqxyKlzXwHxjJ3rsU19Td4ABzW 
+0

Merci beaucoup! J'ai utilisé 'generate-crypted-password' comme vous l'avez suggéré et cela a fait l'affaire. Je n'ai pas du tout remarqué la différence de longueur. Merci merci merci! – tmoore82