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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Node.js

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

Q&A

解決済

2回答

1794閲覧

Node.jsのbcryptで生成したハッシュ値で使用される文字について

退会済みユーザー

退会済みユーザー

総合スコア0

Node.js

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

0グッド

0クリップ

投稿2021/09/28 02:39

IDとパスワードを管理したいのですが、ユーザ一人分と管理者一人分と1個か2個程度なのでSQLを導入するつもりもなく、ハッシュ化してものを単にテキストに保存しておきたいと思うのですが、bcryptで生成されたハッシュ値に使用される文字はASCIIの制御コードを除いたものと解釈してもいいのでしょうか?
例えばNULL0x00とかで区切って保存しても問題ないのでしょうか?

色々調べたのですが「.や,はハッシュ化できますか?」など入力に関する質問は多かったのですが、出力結果の使用される文字の範囲については中々見つけられず、デリミタに何を選んで良いのかわかりませんでした。あるいはそのようなことを考える必要がない使い方をみなさんされているのでしょうか?

常識的な面も含めて教えて頂けると助かります。
よろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

参考記事: Bcrypt - Wikipedia

なるほど、確かにそこ意識したことなかったので一緒に見ていきましょうか。
とりあえず仕様を確認するためにWikipediaを確認。

途中ではUTF-8エンコードするみたいなワードもあって少々わかりづらいですね。
しかし、「説明」セクションに知りたい情報が記述されているようです。

bcryptによってハッシュ化された文字列は"$2a$"や"$2b$" (あるいは "$2y$")という接頭辞を持つ。

この接頭辞はハッシュ化する際に用いたアルゴリズムによって異なり、前述の接頭辞の場合はshadowパスワードファイルがModular Crypt Formatと呼ばれる形式で記述されており、bcryptハッシュであることを示す[10]。
ハッシュ文字列の残りの部分にはコストパラメータ、128ビットのソルト(Radix-64エンコードされて22文字になっている)、184ビットの結果のハッシュ値 (Radix-64エンコードされて31文字になっている)が含まれる[11][要出典]. 。

Radix-64とはなんぞや?

Radix-64はunix/cryptアルファベットを利用するもので、標準のBase-64とは異なる[12][13]。コストパラメータはキー拡張の反復回数を設定するもので、2のべき乗の数となっていて、暗号アルゴリズムの入力値となっている。

ふーむ、作りは違うもののBase-64と同じ文字列を利用しているようですね。
Redix-64のリンクをクリックするとBase-64のページが表示されますし。

Base64は、中略 具体的には、

A–Z, a–z, 0–9 までの62文字と、記号2つ (+, /)、さらにパディング(余った部分を詰める)のための記号として = が用いられる。

接頭語のバージョン表記に$を加えたのがBcryptの全容のようです。

という訳で全てASKIIの内、一般的な文字列と少しの記号しか使ってないようです。

投稿2021/09/28 03:21

編集2021/09/28 03:22
miyabi-sun

総合スコア21203

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

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

退会済みユーザー

退会済みユーザー

2021/09/28 04:45

回答ありがとうございます。 ほぼその値に入っているように見えますが、他のサイトを見ると少なくともdotは使われているよう見えます。カンマは出なさそうなのでcsvで保存はできそうですが・・・もう少し調べてみます。 参考サイト hugo-de-blog.com/node-bcrypt/ www.tekboy.net/bcrypt-calculator
退会済みユーザー

退会済みユーザー

2021/09/28 05:03

https://www.npmjs.com/package/bcrypt ここが公式なのでしょうか、こんな記述がありました。 The characters that comprise the resultant hash are ./ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789$. パディングが=の代わりに.なのかもしれませんね 少なくともカンマ区切りでも心配なさそうです ありがとうございました maisumakunさんの回答を少し待ってクローズさせていただきます
guest

0

ベストアンサー

ハッシュ値を生データのまま持たせるのではなく16進法など適当な形にエンコードしておけば、「そこに現れない文字」はいくらでも取れます。

投稿2021/09/28 03:01

maisumakun

総合スコア146018

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

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

退会済みユーザー

退会済みユーザー

2021/09/28 04:36

回答ありがとうございました ハッシュ値を生成した時点で2byte化するということでしょうか? 例えば0x11,0x12,0x13('123')であれば、0xAA11,0xAA12,0xAA13にするとか? これだと確かになんでも行けそうですね どうしてもはっきりした方法がわからないようなら、この戦法で行かせていただきます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問