質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

Express

ExpressはNode.jsのWebアプリケーションフレームワークです。 マルチページを構築するための機能セットおよびハイブリッドのWebアプリケーションを提供します。

Q&A

解決済

2回答

1076閲覧

DBに暗号化して保存したパスワードと、ログインPOST時に送信するパスワードの比較について node.js

yzmw131321

総合スコア25

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

Node.js

Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

Express

ExpressはNode.jsのWebアプリケーションフレームワークです。 マルチページを構築するための機能セットおよびハイブリッドのWebアプリケーションを提供します。

0グッド

1クリップ

投稿2018/08/08 03:56

編集2018/08/08 04:42

前提・実現したいこと

Node.js で、emailアドレスとパスワードを用いてユーザー登録とログイン機能を実装しようとしています。
登録時に入力したパスワードを暗号化するわけですが、
ログイン時に入力したパスワードと、DB内の暗号化されたパスワードをどう比較すればよいのかわかりません。

方法としては、
1 入力したパスワードを登録時と同様に暗号化する
2 DB内のパスワードを複合化する
があるかと思うのですが、いずれもコードの書き方がいまいち、よくわからないです。

DB: sqlite
パスワード: 英数8~32文字
パスワードの暗号方法: hash  :server/src/models/User.js 参照

ログイン時に、 User.js のhooks内と同様の処理を行ってパスワードを暗号化すればよいかと思うのですが、その書き方がわからないです。

User.js

javascript

1const Promise = require('bluebird') 2// bcrypt-nodejs内のすべてのメソッドにPromise版を追加する 3const bcrypt = Promise.promisifyAll(require('bcrypt-nodejs')) 4 5function hashPassword(user, options) { 6 const SALT_FACTOR = 8 7 8 if (!user.changed('password')) { 9 return; 10 } 11 12 return bcrypt.genSaltAsync(SALT_FACTOR) 13 .then(salt => bcrypt.hashAsync(user.password, salt, null)) 14 .then(hash => { 15 user.setDataValue('password', hash) 16 }) 17} 18 19module.exports = (sequelize, DataTypes) => { 20 const User = sequelize.define('User', { 21 email: { 22 type: DataTypes.STRING, 23 unique: true 24 }, 25 password: DataTypes.STRING 26 }, { 27 // ユーザーをDBに登録する前に、bcryptを用いてpasswordをハッシュする。  28 hooks: { 29 beforeCreate: hashPassword, 30 beforeUpdate: hashPassword, 31 beforeSave: hashPassword, 32 } 33 }) 34 35 User.prototype.comparePassword = function (password) { 36 return bcrypt.compareAsync(password, this.password) 37 } 38 39 return User 40}

試したこと

登録時にパスワードのhashを行わなかった(hooksの記述を削除した)場合、ログインもうまくいきました。

補足情報(FW/ツールのバージョンなど)

全体のソースはgithubに置いています。
https://github.com/AyumuShigeta/VueExpress-Window

master_express.js_server_dir_sqlite_vuetifyブランチで、

$ cd server
$ node src/app.js
でローカルサーバーが起動します。
また、フロント側は
$ cd appSrc
$ npm run dev
で見られるようになります (cssなどのスタイルは整っていません)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

自己解決

1行ずつ、崩して確認をしたのですが
ここで暗号化と比較を同時に行っているようです。
仕組みはまた改めて勉強します。

const bcrypt = Promise.promisifyAll(require('bcrypt-nodejs'))

User.prototype.comparePassword = function (password) {

return bcrypt.compareAsync(password, this.password)

}

投稿2018/08/10 02:16

yzmw131321

総合スコア25

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

1 入力したパスワードを登録時と同様に暗号化する

2 DB内のパスワードを複合化する

1です。パスワードは復号可能な暗号化でDBに格納してはいけません。

いずれもコードの書き方がいまいち、よくわからないです。

「登録時と同様に暗号化する」が何故分からないのか分かりません。

投稿2018/08/08 15:01

otn

総合スコア84507

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yzmw131321

2018/08/10 02:01

何故わからないかというと、ログイン時に記述する、hooks のbeforeCreate,beforeUpdate... に相当する表現を知らないからです(そもそも、hooksにそれを書くのかどうかも含めて)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問