Nu Con mini '21 in Spring ONLINE
Yuichi Watanabe at Nulab Inc.
me := Profile{
Name: "Yuichi Watanabe",
Org: "Nulab Inc.",
Product: "Backlog",
Job: "SRE/Backend",
Twitter: "https://twitter.com/vvvatanabe",
GitHub: "https://github.com/vvatanabe",
Lives: "Fukuoka",
}
import com.nulabinc.zxcvbn.Strength;
import com.nulabinc.zxcvbn.Zxcvbn;
Zxcvbn zxcvbn = new Zxcvbn();
Strength strength = zxcvbn.measure(“This is password”);
int score = strength.getScore();
パスワードの強度を測定するJava製のライブラリ
5年前にOSSとして公開
APIとして提供している測定用のメソッドにパスワードを渡すと、そのパスワードの強度を5つのアルゴリズムを使って複雑性を計算し強度を示すオブジェクトを返す。
Strengthオブジェクトには、強度を示すスコアの他にパスワードの特徴を加味してよりセキュアなパスワードにするための、具体的なフィードバック情報が含まれる。
zxcvbn4jはDropbox社のOSSであるzxcvbnをJavaへ移植したもの
zxcvbnのモチベーションや構成するアルゴリズム
zxcvbnの仕組み自体が広く認知されている
・zxcvbn-python (Python)
・zxcvbn-cpp (C/C++/Python/JS)
・zxcvbn-c (C/C++)
・zxcvbn-rs (Rust)
・zxcvbn-go (Go)
・zxcvbn4j (Java)
・nbvcxz (Java)
・zxcvbn-ruby (Ruby)
・zxcvbn-js (Ruby [via ExecJS])
・zxcvbn-ios (Objective-C)
・zxcvbn-cs (C#/.NET)
・szxcvbn (Scala)
・zxcvbn-php (PHP)
・zxcvbn-api (REST)
・ocaml-zxcvbn (OCaml)
・angular-zxcvbn (AngularJS)
ポーティング一覧 ※READMEから抜粋
きっかけは5年前ヌーラボアカウントチームにジョインした時の最初のタスク
類推されにくいより強度の高いパスワードの設定を促すため
パスワード強度メーターを設置することに
> このUIの要素は、MSR(Microsoft Research)の論文によると類推されづらいパスワードを促してサービスの安全性を高めることに効果的だということが証明されています。お客様自身の大事な情報を守る上でとても重要なパスワード。ヌーラボアカウントでも、類推されにくいより強度の高い設定を促すためにパスワード強度メーターを設置しました。
Refs: https://nulab.com/ja/blog/nulab/password-strength/
他社のWebサービスはどのような基準で測定を行っているのか?
その基準は各サービスによって異なりほとんどがブラックボックスな状態
あるサービスで強いと測定されたものが他では弱いと測定されることも
ブラックボックス化された指標によってユーザーを混乱させたくない
オープンな仕様やライブラリを求めた我々はdropbox/zxcvbnにたどり着く
当時のヌーラボアカウント認証基盤はJava+Spring
サーバーサイドで測定用APIを提供したかった
しかしzxcvbnはあくまでJavaScriptのライブラリ
JavaでJavaScriptを実行するエンジンを検討
エンジンはJava8のNashorn
パフォーマンスに大きな課題があり断念
zxcvbnの初回ロードに数分かかる
ライブラリ内の大きな辞書のロードが原因
import javax.script.ScriptEngine;
import javax.script.ScriptEngineManager;
ScriptEngineManager manager = new ScriptEngineManager();
ScriptEngine engine = manager.getEngineByName("nashorn");
engine.put("pwd",password.toString());
Map<String, Object> strength = engine.eval("zxcvbn(pwd);
Nashornの件はIssueとして上がっていた
zxcvbnをJavaで利用したいといった声も 「zxcvbn for Java. #123」
zxcvbnはCoffeeScriptで書かれておりソースコードを覗くとそこそこ複雑
大きな辞書を抜いた行数を見るとテストコードも含め2000行程
複数の辞書からコードを自動生成するPythonのスクリプトも同梱されていた
その仕組み自体は複雑ではない
アイコンの親和性は高く見えなくもない
ヌーラボアカウントへパスワード測定機能として無事リリース
BacklogのGitで管理していたリポジトリをGitHubへ引っ越し、Mavenで公開
公開後は「zxcvbn for Java. #123」でJavaへポーティングしたことをお知らせ
「zxcvbn for Java. #123」はクローズされ、zxcvbnのREADMEに追記される
ヌーラボアカウントではセキュリティ強化の取り組みを継続して実施
脆弱なパスワードの作成に対してより注意喚起を強化
zxcvbn4jでパスワードの複雑性を判断
haveibeenpwnedのAPIを使って他サービスで漏洩したかどうか検知
公開して1ヶ月くらい経つと国外の方から記念すべき最初のプルリクエスト
公開したソフトウェアに国外からの反応があるのは初めての経験だった
プログラミングを通して世界と繋がった気がして小躍り ʕ◔ϖ◔ʔ
最初のプルリクエストの後すぐに同じ方からプルリクエスト
内容はフィードバックメッセージのローカライズ
当初zxcvbn4jがサポートするフィードバックメッセージは英語のみ
ヌーラボ社内でもメッセージをローカライズできる仕組みを検討していた矢先
これによりヌーラボアカウントでも言語設定に応じてメッセージを変更可能に
なぜここまでコントリビュートしてくれたのか?
同月さらに同じ方からプルリクエストが届く
公開したソフトウェアが初めて他社の製品で導入され二度目の小躍り ʕ◔ϖ◔ʔ
この件でOSSとの向き合い方を学ぶ
zxcvbn4jはzxcvbnのポーティング
オリジンとの互換性を保ちたい
zxcvbnに改修が入ると差分をアップデート必要がある
CoffeeScriptを見て差分をJavaの実装へ落とし込む
大きな粒度で差分を見ると変更に圧倒されてしまう
コミット単位で少しづつ移植
コミットが整理されていると歴史を追いやすい
業務タスクの粒度が大きすぎる時に小さく分解して地道に消化する手法と同じ
互換性を保つ取り組みも有志のコントリビュートに助けらた
中を覗いてみると...
おお!Nashorn Nashornじゃないか! 久しぶりじゃないか、元気にしてたか?
なんとポーティングする前に検証した結果見送ったNashornが帰ってきた
zxcvbnのJSをNashornで実行してzxcvbn4jの結果と比較する自動テストだった
※ NashornはJDK 11で非推奨、15で廃止されている。現在GraalJSへの移行をを検討中
Webセキュリティ学習用のアプリケーション「OWASP Web Goat」で導入される
セキュリティの第一線であるOWASPが提供しているJava製のOSS
Webセキュリティに対するリテラシーを高める活動に間接的に貢献
メンテナンスを継続するやる気にも繋がった
※ Central Statistics on oss.sonatype.org 調べ
Cyberduck、Cryptomator、JetBrains、某セキュリティソフトのAndroidアプリでも
GitHub上のOSSやMvnrepository上のライブラリから
業務に関連するソフトウェアであれば自分の裁量で業務中にコントリビュートできる
ただし明文化されていないため判断しにくさもある
OSSポリシーの策定など明文化されたルールを運用することで改善していきたい
OSSの文化を組織のトップが大事にしている
組織としてOSS活動が理解される大きな要因になっている
これ迄に起票されたIssueを全て自分だけで対応したわけではなく
ヌーラボには比較的もJavaが得意な開発者が多い
気兼ねなく相談できる雰囲気に救われた
ヌーラボ内には他にもOSSとして公開しているモノが複数ある
同僚達の活動は良い刺激にもなる
# OAuth 2.0 サーバーサイドのScala実装
nulab/scala-oauth2-provider maintained by tsuyoshizawa
# GoogleスプレッドシートによるBacklog課題一括登録
nulab/backlog-bulk-issue-registration-gas maintained by shomatan
# Backlogへのデータ移行ツール
nulab/BacklogMigration-Jira maintained by shomatan
nulab/BacklogMigration-Redmine maintained by yuichi0301
# 各サービスのAPIクライアント
nulab/backlog4j maintained by Backlog Developers
nulab/backlog-js maintained by mmktomato
nulab/go-typetalk maintained by Typetalk Developers
オリジンのzxcvbnは間違いなく偉大なソフトウェアのひとつ
コミュニティに愛され、数多くの言語に移植され独自のエコシステムを広げてきた
5年間のメンテ活動を通して偉大なソフトウェアの価値を繋ぐハブの一つにはなれた?
そのハブを継続できているのも間違いなく有志のコントリビュートのおかげ
世界に一石投じるようなソフトウェアを生みだすのはほんの一握り
OSSとの関わり方はそれだけではない
1つのIssueの報告、1行のコード修正
小さな共創関係を築くことは大きな価値を形作る大切なピースになる
NuCon> git commit -m "ご静聴ありがとうございましたʕ◔ϖ◔ʔ"