k01ken’s b10g

He110 W0r1d!

Windows上にてRuby 2.3でBCryptを使う方法

開発環境はWindows 7 Professional(32bit)+Ruby 2.3.3p222+Rails 4.2.1。

Railsのログイン処理にBCryptを使いたかったのですが、どうも、うまくいくのが、Ruby 2.2までらしくて、Ruby 2.3以降はWindows環境でやる場合は、自分でビルドしなければならないみたいです。ruby2.3だとDevKit, 2.4以降だとMSYS2によって可能。
(MacLinuxの場合は、インストールと同時にビルドするので問題なくできるようです。)ビルドというのは、おそらく.soファイル(Windowsでいう.dllファイル)を作ることでしょう。

そこで、Rubyのファイルを色々、いじっていると、予想外なことにできたので、書いておきます。他のサイトだと、ここまで具体的な手順で書いてなかったので、もし、同じ問題を抱えている人がいれば、何か助けになると思います。

1.gem install bcryptでインストール
bcryptがすでにインストールされている場合は、gem uninstall bcryptで削除しておく。
これで、bcrypt-3.1.11-x86-mingw32が作られます。
2.コマンドプロンプトにて、cd c:\devkit(devkitのあるディレクトリをカレントディレクトリにする)と入力し、続けて、ruby dk.rb init、続けて、ruby dk.rb installを入力。
3.gem install bcrypt --platform rubyを入力。これでビルドされる。
これで、bcrypt-3.1.11が作られます。
4.C:\Ruby23\lib\ruby\gems\2.3.0\gems\へ移動する。
5.bcrypt-3.1.11/bcrypt/libフォルダからbcrypt_ext.soをコピーする。
6.bcrypt-3.1.11-x86-mingw32/libフォルダ内に、2.3というフォルダを作成する。
そして、その中に、先ほど入れたbcrypt_ext.soをペーストする。

簡単なスクリプトを書く。

require "bcrypt"
pass = "password"
puts BCrypt::Password.create(pass)

これで60文字分、生成される。

BCryptの代替案として、digest::SHA512をやっていたのも、ついでに書いておく。
1.コマンドプロンプトにて、gem install digestと入力し、digestをインストール。
2.コードを書く。

require "digest/sha2"
pass = "password"
puts Digest::SHA512.hexdigest(pass)

16進数の文字列が、128文字分、生成される。

今回の得られた教訓として、
1.Windowsは開発環境として向いていない(環境を整えるという本質とは関係ないところに手間がかかることが多い)
2.Railsで実行するまえに、簡単なrubyスクリプトを書いて、動くのか検証すること
3.こうやって苦労した経験は後々、役に立つのだろうか?

参考リンク
【Rails】bcryptインストール時の"cannot load such file -- bcrypt_ext"エラー対応【Windows】 - Qiita
・ここのサイトのコメント欄が参考になりました。
SHA-256ハッシュ値 - Qiita
class Digest::Base (Ruby 2.5.0)