Tomcat8.5における認証パスワードのDigest化

嵌まったねぇ~w

まず、Tomcatでは、BASIC、DIGEST、FORMなどの認証は、当たり前のようにサポートされている。で、Digest認証っていうのは、通信の際のパスワードを暗号化するもので、例えばJDBCでのパスワード検証を行おうとすると、DBの中にいれておくのは、平文となる。

ここで、「平文での保存はねぇ。。。。」と思うのが普通で、パスワード自体を暗号化して保存しておきたくなる。ここからが、今回の嵌まりどころ。

まず、Tomcatでは、Realmディレクティブに対して「digest=”MD5″」みたいなattributeを加えれば、パスワード照合をMD5でやる!っていうふうな記事をいくつもみつけたので、それに従ったけど、まったく暗号化された文字列では照合せず、平文バリバリで照合していた。

で、最終的に辿り着いたのは、StackOverflowの記事と、(やっぱり)本家Apacheの文章。そこでわかったのが、Realm定義の中側に、「CredentialHandler」の定義が必要で、その中でMD5なりSHAなりを指定する必要があるということ。なので、こんな感じのcontext.xmlを書く事になる。

さらに、MD5のDigestedなパスワードも、いわゆる32桁のハッシュ値ではなくて、Javaのライブラリを使ったものである必要がある。これがよくわからず、結果的に1日費やして、やっとわかった。いや、本家のサイトには「パスワードを生成する2つの方法」として書いてある。。。ちゃんと本家のサイトの通りにやらないといけないのね。。。w

これをDBに保存して、やっとこさ、認証ができた。昔はこんなことばかりやってたから、今こんな感じで解決できるけど、経験してないと途中で投げ出したくなるな。。。w

<Realm className="org.apache.catalina.realm.JDBCRealm"
debug="99"
driverName="org.postgresql.Driver"
connectionURL="jdbc:postgresql://localhost:5432/TEST"
connectionName="test"
connectionPassword="test"
userTable="m_user"
userNameCol="userid"
userCredCol="passwd"
userRoleTable="m_user"
roleNameCol="user_post_id" >
<CredentialHandler className="org.apache.catalina.realm.MessageDigestCredentialHandler" algorithm="MD5" />
</Realm>

ではでは~。

コメントを残す