一体何を書いているのか?
class << self
attr_accessor :min_cost # :nodoc:
end
self.min_cost = false
.
.
.
cost = ActiveModel::SecurePassword.min_cost ? BCrypt::Engine::MIN_COST : BCrypt::Engine.cost
self.password_digest = BCrypt::Password.create(unencrypted_password, cost: cost)
出典
has_secure_password.rb
https://gist.github.com/thirotan/013f0336025b1644facc#:~:text=Raw-,has_secure_password.rb,-module%20ActiveModel
条件演算子(三項演算子)
式 ? 真だった場合の処理 : 偽だった場合の処理
出典
self.min_cost = false
が偽を返している
BCrypt::Engine.cost
が作動する
.cost ⇒ Object
Returns the cost factor that will be used if one is not specified when creating a password hash.
パスワードハッシュを作成する際に、指定がない場合に使用されるコストファクターを返します
。
出典 deepl
コストファクターとは
Bcrypt
Bcryptは暗号の1つであるBlowfishを基盤としたハッシュ関数です。Argon2ではパラメータを3つ指定できましたが、Bcryptではコストと呼ばれる強度を調整するパラメータがあり、コストが12の場合、反復回数は2の12乗になります。
ストレッチング回数(コストパラメータ)
次に「$10$」の「10」はストレッチング回数を示します。この数字は2のn乗のn部分を示しているので、今回は2の10乗で1024回ストレッチングされています。
ハッシュ化されている文字列はいくつかの区分に分けられます。
まず 最初の $ $ で 囲われている部分はバージョンです。
次に $ $で囲われているのは、コストの部分です。
これは、2を基数とした指数となり、この数の2の累乗がEksblowfishでのセットアップ中での繰り返し回数になります。(ストレッチング)
この回数が多ければ、ブルートフォース攻撃になどに対する対抗が強くなります
が、その分計算量が増えて計算に時間がかかるようになります。
感想
Mysql2::Error: Unknown column 'users.password' in 'where clause'
でエラーが起きた。
テーブルにpasswordではなくpassword_digestを入れていたからだ。
このエラーの解決法がわからなかった。
代替法でpassword_digestに直接加えたらハッシュ化できるようになった。
解決法はわからなかったが、どういうふうにパスワードがハッシュ化されているかのかを少し学習できてよかった。
解決法がわからなければコードを見て自分なりに理解できる範囲で妥協ぐらいのことはできると思うので
これから頑張りたい。