客先のデータ保存システムへのアクセスで、ログインにチャレンジ文字列を使ったパスワードの暗号化が必要ということが判明。Webサービス経由でサーバーに要求を掛けるとRSA暗号化用のModulus(モジュラス)とExponent(エクスポーネント)、チャレンジ文字列を返してくるので、チャレンジ文字列とパスワードをくっつけてModulus、Exponentで暗号化して返せと言われているのですが……やったことない。
仕方ないのでWebサービスにアクセスするプログラムをVisual Studio 2013 + VB.NETで組み、実際の要求はSoapUIも使ってインターフェースや戻りを確認しながらサンプルを組むことに。
サーバーからExponentとModulusをもらう
最初に、ログインさせろ、という要求を投げると以下のような文字列が返ってくる。これはSoapUIで実際のWebサービスにアクセスして、チャレンジ文字列の取得Webメソッドを実行した結果。
<tns:challenge>grh9ir</tns:challenge> <tns:publicKeyModulus>habdmUG1oQCltWupCgBDb+iSBj……(中略)……zUGGDbHLFebQ==</tns:publicKeyModulus> <tns:publicKeyExponent>AQAB</tns:publicKeyExponent>
publicKeyModulusというタグのところにある文字列……末尾から、おそらくBase64でエンコードされているようなので、System.Convert.FromBase64Stringでデコードしてバイト配列にする。
次にExponent。AQABって??……どうもここは数値を指定するようなのだけれど、返されたのは文字。そのまま設定してもデータがおかしいというエラーが出るし、なんだろうと思い調べてみたら、これもBase64でエンコードされていました。Base64でデコードすると「{01,00,01}」、すなわち「65537」。これは下記のStackoverflowのやりとりから気づきました(Javaソースのコメント……)。
テキストボックスに設定したModulusとExponentで文字列暗号化
とりあえず、パスワードを暗号化して渡すための序段として、適当な文字列を指定されたModulusとExponentで暗号化する処理を書いてみる。ロジックは下記の通り。各情報は画面上に用意したテキストボックスから入力させるようにして動かしてみると……とりあえず動いた。コードはVB.NET。
' RSAパラメーターにモジュラス、エクスポーネントの値を設定する ' モジュラス、エクスポーネント共にBase64エンコードされて届くので、デコードしてバイト配列にしたうえで ' RSAParametersに設定する。 Dim rsaParams As New RSAParameters() rsaParams.Modulus = FromBase64String(TextModulus.Text) rsaParams.Exponent = FromBase64String(TextExponent.Text) ' RSA暗号化オブジェクトにパラメーターを設定する Dim rsa As New RSACryptoServiceProvider() rsa.ImportParameters(rsaParams) ' 暗号化実施。結果はバイト配列で取得されるので、最終的にテキストに戻す Dim resultBytes As Byte() = rsa.Encrypt(UTF8.GetBytes(TextInput.Text), False) TextResult.Text = UTF8.GetString(resultBytes)
これを使って、Webサービスから戻ってきたチャレンジ文字列をパスワードにくっつけて暗号化すれば、ログイン処理がうまくいくと思われる。試してみよう。
とりあえず今日はこのあたりまで。
- 作者: 科学雑誌Newton
- 出版社/メーカー: 株式会社ニュートンプレス
- 発売日: 2015/11/26
- メディア: Kindle版
- この商品を含むブログを見る
RSAセキュリティオフシャルガイド暗号化 (RSA press)
- 作者: スティーブバーネット,ステファンペイン,セキュリティダイナミック社=,RSAセキュリティ,Steve Burnett,Stephan Paine,スリーエーシステムズ
- 出版社/メーカー: 翔泳社
- 発売日: 2002/03
- メディア: 単行本
- クリック: 5回
- この商品を含むブログ (1件) を見る