7
votes

Implémentation de bcrypt dans Angular 7

J'essaie d'utiliser bcrypt avec Angular7 pour stocker un mot de passe crypté dans MySQL.

J'ai utilisé npm install bcrypt pour installer bcrypt et l'importer comme si import * as bcrypt from 'bcrypt'; .

Tout se compile bien jusqu'à ce point; il ne parvient pas à le faire lorsque j'ajoute bcrypt.hash()

Le code complet du fichier login.component.ts est ci-dessous:

import { Component, OnInit } from '@angular/core';
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import * as bcrypt from 'bcrypt';

@Component({
  selector: 'app-login',
  templateUrl: './login.component.html',
  styleUrls: ['./login.component.scss']
})

export class LoginComponent implements OnInit {

loginForm : FormGroup;
success = false;
loginFailed = false;

constructor(private formBuilder : FormBuilder) { }

ngOnInit() : void {

    this.loginForm = this.formBuilder.group({
      username: ['', Validators.required],
      password: ['', Validators.required]
    });
}

DoLogin()
{
    console.log(this.loginForm.value);

    pass = bcrypt.hash('Pass@123', 10); // App is not compliling when I add this line //
}

Comment appeler les méthodes dans bcrypt?


10 commentaires

Les méthodes bcrypt sont asynchrones , vous devez passer un rappel ou résoudre la promesse.


Pourquoi chiffrez-vous côté client?


@jonrsharpe Pouvez-vous me donner un exemple, je suis nouveau sur Angular.


Cela n'a vraiment rien à voir avec Angular, les documents bcrypt montrent comment interagir avec leur API.


@JonasPraem J'apprends Angular et mon objectif est de crypter le mot de passe avant de l'envoyer à mon API (python) qui stockera le mot de passe crypté dans la base de données.


@jonrsharpe Voulez-vous dire ceci: bcrypt.hash (myPlaintextPassword, saltRounds, function (err, hash) {// Stockez le hachage dans votre DB de mot de passe.}); J'ai essayé cela aussi, il ne compile pas.


Oui, c'est l'utilisation du rappel.


Essayé à nouveau mais il ne compile pas. J'obtiens l'erreur suivante: Échec de la compilation. ./node_modules/node-gyp/lib/node-gyp.js Module non trouvé: Erreur: Impossible de résoudre '../package' dans 'D: \ 1833 \ Projs \ ng \ ng-materialUI \ node_modules \ node- gyp \ lib '


Je pense qu'il est plus facile d'utiliser bcryptjs - npmjs.com/package/bcryptjs ... bcrypt semble être conçu pour être utilisé dans NodeJS.


Merci pour l'info; va vérifier cela.


5 Réponses :


0
votes

Votre façon d'utiliser bcrypt dans votre application Angular.

Tout d'abord, seule l'installation de bcrypt à l'aide de "npm install bcrypt" pour une application angulaire ne fonctionnera pas. Parce que bcrypt lui-même a 2 dépendances comme,

  1. node-pre-gyp
  2. Abstractions natives pour Node.js

Si vous installez ces deux, votre application peut fonctionner avec bcrypt.

Ma façon d'utiliser bcrypt pour l'application Angular. J'ai installé le bcrypt-js en utilisant "npm install bcryptjs --save".

NODE.js Sur node.js, l'interface randomBytes du module de cryptage intégré est utilisée pour obtenir des nombres aléatoires sécurisés.

NAVIGATEUR Dans le navigateur, bcrypt.js s'appuie sur l'interface getRandomValues de l'API Web Crypto pour obtenir des nombres aléatoires sécurisés. Si aucune source aléatoire sécurisée par cryptographie n'est disponible, vous pouvez en spécifier une via bcrypt.setRandomFallback.

Comme nous l'utilisons pour le navigateur, Angulars node.js n'a pas de module appelé "crypto", car bcrypt a besoin d'un module pour créer un nombre aléatoire sécurisé avec ce module de cryptage, vous obtiendrez donc un avertissement dans votre application "crypto" module introuvable.

Pour vous débarrasser de cet avertissement, vous devez vous rendre à cet emplacement de fichier dans votre projet, D: \ <> \ node_modules \ bcryptjs \ dist \ bcrypt.js, ligne n ° 70.

soit vous commentez cela, soit vous placez ce bloc try sous le second bloc try.

Dans ce code, ce qui se passe, c'est d'abord que le bcrypt essaie de générer le nombre aléatoire à partir du module "crypt", si ce n'est pas le cas, il utilisera l'API Web pour générer le nombre aléatoire sécurisé, c'est l'url: https : //www.w3.org/TR/2017/REC-WebCryptoAPI-20170126/ .

ou vous pouvez écrire votre propre logique pour fournir le nombre aléatoire, mais ce ne sera pas assez sûr.

J'espère que tu comprends.

Veuillez m'envoyer un ping en cas de doute.


0 commentaires

6
votes

Vous pouvez installer bcryptjs ( npm install bcryptjs ) et utiliser le code suivant:

"browser": {
    "fs": false,
    "path": false,
    "os": false,
    "crypto": false,
    "stream": false,
    "http": false,
    "tls": false,
    "zlib": false,
    "https": false,
    "net": false
  }

Votre code doit ressembler à:

import { Component, OnInit } from '@angular/core';
import { FormBuilder, FormGroup, Validators } from '@angular/forms';
import * as bcrypt from 'bcryptjs';

@Component({
  selector: 'app-login',
  templateUrl: './login.component.html',
  styleUrls: ['./login.component.scss']
})

export class LoginComponent implements OnInit {

loginForm : FormGroup;
success = false;
loginFailed = false;

constructor(private formBuilder : FormBuilder) { }

ngOnInit() : void {

    this.loginForm = this.formBuilder.group({
      username: ['', Validators.required],
      password: ['', Validators.required]
    });
}

DoLogin()
{
    console.log(this.loginForm.value);

    const salt = bcrypt.genSaltSync(10);
    pass = bcrypt.hashSync('Pass@123', 10);
}

Après cela, si vous obtenez un Module not found: Error: Can't resolve 'crypto'... erreur Module not found: Error: Can't resolve 'crypto'... , vous devez ajouter ce code dans le fichier packaje.json:

import * as bcrypt from 'bcryptjs';

const salt = bcrypt.genSaltSync(10);
pass = bcrypt.hashSync(this.loginForm.value.password, salt);

J'espère que cela aide quelqu'un.


2 commentaires

Salut monsieur j'ai une question, j'ai implémenté bcryptjs dans mon application angulaire aussi je savais que Spring utilise également Bcrypt pour hacher le mot de passe mais je n'obtiens pas le même résultat aucune explication? Merci .


@CHARFEDDINEAmine Je n'ai pas vraiment d'expérience dans ce domaine, mais vérifiez si vous fournissez le même nombre de "tours" de sel à Spring et Angular. Comme vous pouvez le voir, il fournit 10 cycles de salage à l'application Angular, et pour autant que je sache, la valeur par défaut pour le salage est de 12, vous devrez peut-être changer le salage dans l'application Angular ou Spring.



0
votes

Vous pouvez installer * npm install bcryptjs * à partir du terminal. Avec cela, vous obtiendrez les bibliothèques de bcryptjs.
L'étape suivante consiste à changer votre ancien ( import * comme bcrypt de 'bcrypt'; ) au nouveau:
import * comme bcrypt depuis 'bcryptjs';
Utilisez les mêmes méthodes et cela ne m'a posé aucun problème.
Exemple:

    if ((user == users[i].username) && (bcrypt.compareSync(pass, users[i].password))) ok = true;


1 commentaires

Ayez un principe KISS, restez simple, et cette déclaration «si» est trop complexe, doit être simplifiée le plus possible.



0
votes

Vous pouvez utiliser sha.js : le repos est à vous :)

npm install --save sha.js

import * as shajs from 'sha.js';

shajs('sha256').update({stringToBeHashed}).digest('hex')


0 commentaires

0
votes

oui, vous pouvez utiliser npm install bcryptjs --save au lieu de npm install bcrypt --save

bcryptjs not giveng error, vous pouvez donc l'utiliser en angular


0 commentaires