japan.internet.com The Internet & IT Network


RSSニュース検索
カテゴリ
> トップページ
> Webビジネス
> Eコマース
> Webファイナンス
> Webマーケティング
> パブリック
> Webテクノロジー
> 携帯・ワイヤレス
> Linux Today
> Linux Tutorial
> J.I.C.ブログ
キャリア
> 転職ならen
> 派遣ならen
> アルバイトならen
> IT求人情報
ヘッドライン
> 今日のヘッドライン
> 週間ヘッドライン
Special Link
> フォトコミュニティ
> ストックフォト
> クリップアート
> イラスト
> フェリカ
> Web2.0
> 写真
イベント&セミナー
> イベントカレンダー
> 書評「IT の耳」
> 出張・接待検索
> ニュースガジェット 注目
無料ニュースメール
> 新規登録
> 変更・解除
> オプトインメールの登録・変更・解除
インフォメーション
> パートナーサイト
転職ならエン
就職ならen
求人ならen
履歴書ならen
アルバイトならエン
CRM/SFAならオラクル
> グループ会社
株式会社アエリア
(株)サンゼロミニッツ
株式会社エアネット
> お問い合わせ
> 広告掲載について
> リンクについて
> 著作権について
> その他お問い合わせ
> 利用規約
> 個人情報保護方針
> 会社概要地図
デベロッパー 2006年1月10日 10:00
デベロッパー・バックナンバー
ASP.NETで機密データを暗号化して保存する

著者: Scott Mitchell  オリジナル版を読む プリンター用 記事を転送
2006年1月10日 10:00 付の記事
海外internet.com発の記事
このエントリーを含むはてなブックマーク この記事をクリップ! Buzzurlにブックマーク Yahoo!ブックマークに登録 newsing it!

はじめに

 News.comやZDNetなどの技術ニュースサイトでは、ある有名企業のデータベースがハッカーの侵入を受けて、顧客の個人情報が大量に流出したというニュースが、ほぼ数週間おきに盛んに報じられています。もし、一般公開されるデータドリブンのWebアプリケーションを構築する立場であれば、このようなニュースを耳にして思わずぞっとすることでしょう。外部の脅威からアプリケーションのデータを守るには、どのような手段を講じればよいのでしょうか。

 データドリブンアプリケーションを悪意のあるハッカーから保護するために実施できる手段は、数多くあります。最初の、そして最も重要な方法は、データベースソフトウェアを強化することです。最新のサービスパックがインストールされていますか? Microsoft SQL Serverを使用している場合は、saアカウントに対して十分に複雑なパスワードを設定していますか? データベースは、Windows認証のみを許可するように設定されていますか? データベースのセキュリティ向上の詳細については、「10 Steps to Help Secure SQL Server 2000」を参照してください。SQL Serverを可能な限り最適に設定したとしても、不測の事態が発生して、悪意ある人の手にデータが渡らないとは限りません。財務記録や社会保障番号など、特に機密性の高い情報がある場合は、セキュリティのレイヤを新たに追加し、機密データを暗号化する必要があるかもしれません。

 Microsoft SQL Server 2000以前のバージョンは、データベーステーブルのコンテンツを自動的に暗号化する方法を備えていません(この記事の執筆時点でSQL Server 2005はまだベータ版ですが、ネイティブの暗号化機能を備えています。詳細については、「SQL Server 2005 Security - Encryption」を参照してください)。したがって、テーブルのコンテンツを暗号化するのであれば、自分自身で行う必要があります。さまざまな方法がありますが、この記事では、.NETレイヤ内でコードを使用して、SQL Serverに機密データを書き込む前にそのデータを暗号化する方法と、SQL Serverから暗号化されたコンテンツを読み取るときにそれをプレーンテキスト形式に復号する方法について説明します。

データベースコンテンツの暗号化の概要

 Eコマースサイトのデータベースを作成するものとしましょう。このデータベースの「Customers」テーブルには、NameAddressEmailCustomerSinceCreditCardNumberCreditCardExpirationのようなフィールドが含まれています。「Customers」内のすべてのレコードとフィールドはもちろん非公開でなければなりませんが、支払いに関するフィールド(CreditCardNumberおよびCreditCardExpiration)は、特に非公開であることが必要です。顧客の電子メールアドレスや自宅住所がハッカーに流出した場合、顧客は当然ながら不愉快な思いをしますが、支払い情報が流出した場合は、不愉快なだけでなく、実際の経済的な被害を引き起こすおそれがあります。そこで、この記事では、最悪の場合を想定し、次のように考えることにします。「データベースサーバーは可能な限り強化したので、これを破るのは非常に困難だ。たとえ、セキュリティが破られてデータが危険にさらされても、支払い情報が暗号化されていれば、最も重要な情報はさらに保護されているわけだから大丈夫だ。」

 これを実現するには、いくつかの課題、懸案、および問題があります。

  1. データベースのスキーマ
  2. CreditCardNumberフィールドとCreditCardExpirationフィールドを単にプレーンテキストとして格納している場合、これらはおそらく単なるvarcharフィールドです。しかし、これらを暗号化する場合、フィールドのデータ型は何が適当でしょうか?
  3. データベースにデータを挿入する前にデータを暗号化する方法
  4. 同様に、データベースから読み取ったデータをプレーンテキスト値として表示できるように復号する方法も考えなければなりません。
  5. 使用する暗号化アルゴリズムと、選択した暗号化ルーチンが全体的なセキュリティに及ぼす影響
  6. 具体的に言えば、暗号化された支払い情報がハッカーの手に渡った場合に、ハッカーがこれを復号できるでしょうか?
  7. テーブルに格納されているデータを暗号化した場合の影響(ある場合)
  8. パフォーマンスを低下させる可能性はありますか? 可用性や保守性についてはどうですか? 基になるデータに対して実行できるクエリの種類は制限されますか?

 これらはすべて、この記事全体を通して取り組む重要な問題です。すぐに取り上げる問題もあれば、後で扱う問題もあります。

 暗号化されたデータを格納するには、varbinary型のフィールドを使用します。つまり、暗号化データは、一連のバイトとして保存されます。そのため、暗号化データを挿入または更新する場合は、ASP.NETアプリケーションから次の操作を実行する必要があります。

  1. ユーザーのプレーンテキスト入力を取得します。
  2. それを暗号化します。
  3. それを文字列からバイト配列に変換します。
  4. INSERT/UPDATEステートメントを実行します。

 反対に、データベースから暗号化データを読み取る場合は、基本的に逆の操作を実行する必要があります。

  1. SELECTステートメントを使用して、データベースから暗号化データを読み取ります。
  2. それをバイト配列から文字列に変換します。
  3. それを復号します。
  4. プレーンテキストデータを処理します。

 この手順は、暗号化データを挿入/更新または読み取るたびに毎回繰り返す必要があります。そこで、何度も繰り返されるこの機能を、ラッパークラスに移動することを強くお勧めします。ASP.NETにおけるコード再利用法の詳細については、「Accessing Common Code, Constants, and Functions in an ASP.NET Project」を参照してください。

 「Customers」テーブルの中で、暗号化フィールドは支払いに関係するCreditCardNumberフィールドおよびCreditCardExpirationフィールドだけであり、他のすべてのフィールドはプレーンテキストであることに注意してください。したがって、顧客の支払い情報の読み取りや挿入/更新を行う場合のみ、これらの手順を実行する必要があります。

暗号化アルゴリズムの選択

 暗号化アルゴリズムには、対称と非対称の2種類があります。対称アルゴリズムでは共有キー(secret key)を使用します。これは、暗号化と復号の当事者のみが知るビット情報です。非対称暗号化では、公開キー(public key)と秘密キー(private key)を使用します。これらの暗号化モデルの詳細については、この記事では触れません。今回のサンプルでは、対称暗号化を使用します。

対称暗号化の欠点
 対称暗号化の一番の弱点は、使用される共有キーです。データベースに侵入したハッカーが、データの暗号化と復号に使われる対称キーを見つけたら、支払い情報を簡単に復号できてしまいます(あなたのキャッシュカードを手にした泥棒がそのカードの暗証番号を知ってしまったら、口座の残高があっという間にゼロになるのと同じです)。この対称キーは、ASP.NET Webアプリケーションのコードの中に格納されます。そのため、暗号化された支払い情報をハッカーが手に入れるためには、データベースサーバとWebサーバーの両方に侵入する必要があります。
 話はそれますが、このことは、セキュリティの基本概念の1つをよく表しています。つまり、「絶対的なセキュリティ」などというものは現実には存在しないということです。もちろん、アプリケーションのセキュリティを強化する手段を講じることはできます。しかし、完璧に保護されたセキュリティを実現することは不可能です。抜け穴や裏口は常に存在するものであり、サーバールームにアクセスできる不満を抱えた従業員などもいるでしょう。セキュリティに優れたアプリケーションを作成するということは、攻撃者にとっての攻略難易度を可能な限り高めることです。

 暗号化ルーチンの中にも、特に堅牢性に優れているものがいくつかあります。最も堅牢な対称暗号化ルーチンの1つがAESです。AESは、米国政府が使用する対称キー暗号化の標準規格です。実際、AESを使用してデータベースの暗号化を実現する方法について、優れた記事が既に発表されています(『Implementing Encrypted SQL Server Database Columns with .NET』)。.NET FrameworkのSystem.Security.Cryptography名前空間には、この暗号化アルゴリズムを実装しているクラスが用意されています。

 AESの観点については既に説明されているため、この記事では別の対称暗号化ルーチンを使用します。ここでは、特にRC4を使用します。RC4を選択した1つの理由は、4Guysで以前に発表されたMike Shafferの記事『RC4 Encryption Using ASP & VBScript』が、Chris Scottの記事『Converting Mike Shaffer’s VBScript RC4 Encryption Code to C#』の中で.NETコードに変換されたことです。このアルゴリズム(さらに言えば、セキュリティに関係するアルゴリズム)を実際のコードで使用する前に、RC4およびその長所と短所についてしっかり理解してください。

 対称暗号化について、最後に1つだけ述べておきます。共有キーでデータを暗号化する場合、同じデータに対して同じ共有キーを使用すると、同じ暗号化出力が得られることに注意してください。暗号化している出力が複製を持つ場合、このことは、システムの弱点になり得ます。たとえば、顧客xのクレジットカードの有効期限が07/09であることを、ハッカーが知っているものとします(彼自身が顧客xの場合もあれば、他のサイトで顧客xの支払い情報を入手した場合もあります)。顧客xの暗号化された有効期限が、たとえば「&9k@m」であることがハッカーに知られた場合、暗号化された有効期限が同じ「&9k@m」である他の顧客についても、そのクレジットカードの有効期限が07/09であることが判明してしまいます。この情報だけでは、ハッカーが何をできるわけでもありませんが、不正な目的に一歩近づいたことは確かです。

 この弱点を克服するには、共有キーに、各行固有の特別なビット情報を加えることが重要です。つまり、まったく同じ共有キーを使用してすべての顧客の有効期限を暗号化するのではなく、共通の共有キーに顧客のCustomerIDフィールドを連結して作成した共有キーを使用するのです(もちろんこれは、CustomerIDフィールドが変わらないことを前提にしています。それよりも、ソルト(salt)を保持する別のフィールドをテーブルに作成する方が賢明です)。ソルト処理の詳細については、4Guysに掲載されたThomas Tomiczekの記事『Could you Pass the Salt? Improving the Security in Encrypting Passwords using MD5』を参照してください。

 以降では、データベースの作成と、必要な暗号化/復号を実行するコードの作成について説明します。

Customersデータベーステーブルの作成

 ここまでに説明したように、暗号化データをデータベースに格納する場合はvarbinary型のフィールドを使用するのに対して、非暗号化フィールドは、通常のデータ型を維持します。したがって、「Customers」テーブルのスキーマは次のようになります。

「Customers」テーブル
CustomerIDint, PK, IDENTITY(1,1)
Namenvarchar(100)
CustomerSincedatetime
Emailvarchar(150)
CreditCardNumbervarbinary(25)
CreditCardExpirationvarbinary(10)
......

 顧客ごとに一意なソルトを格納する、varchar型のSaltフィールドを追加することもできます。または、既存の顧客のCustomerIDフィールドが変わらないという前提で、CustomerIDをソルトとして使用することもできます。

暗号化データの挿入および更新

 今回の例では、「Customer」テーブルの支払い関係のフィールドのみを暗号化するため、通常は、顧客情報を挿入または更新する前に、データの暗号化について気にする必要はありません。暗号化処理が必要になるのは、顧客の支払い情報の挿入または更新時だけです。

 これを実現するコードは、比較的簡単です。

’Start by creating an instance of the RC4Encrypt class
Dim rc4 As New main.rc4encrypt 

’Set the secret key and data to encrypt
rc4.Password = <YourSecretKey> & <customerID>
rc4.PlainText = <Data To Encrypt>

’Get the encrypted results back as a string
Dim encString As String = rc4.EnDeCrypt()

’Convert the string into a byte array
Dim encData() as Byte = System.Text.Encoding.UTF8.GetBytes(encString)

’Update the database
Dim sql = "UPDATE Customers SET CreditCardNumber = @CCN " & _
          "WHERE CustomerID = @CustID"

...

myCommand.Parameters.Add("@CustID", <customerID>)
myCommand.Parameters.Add("@CCN", encData)

myCommand.ExecuteNonQuery()
...

 このコード例では詳細が省略されていますが、キーポイントは明らかです。暗号化を実行するために、『Converting Mike Shaffer’s VBScript RC4 Encryption Code to C#』で紹介されているmain.rc4encryptクラスを使用しています。最初に、このクラスのPasswordプロパティとPlainTextプロパティを、共有キーと暗号化するデータにそれぞれ設定します。ここで使用する共有キーは、ある基本文字列と、顧客のCustomerID(またはキーをソルト処理するために使用するもの)で構成されます。次に、実際のデータが暗号化され、暗号化された結果を含む文字列が返されます。さらに、文字列がバイト配列に変換され、アドホックSQLステートメントを使用して、「Customers」テーブル内の該当する行が更新されます(ストアドプロシージャを使用するのが最適です)。

ASP.NETアプリケーション内のデータの復号と操作

 上記のコード例は、データをデータベースに格納する前に暗号化する方法を示していました。既存の支払い情報を操作する必要がある場合は、ASP.NETアプリケーションの中で、最初に、暗号化されたデータベースデータを取得し、それを復号する必要があります。これは、先ほど紹介した手順の逆に相当します。

’Read in the encrypted database data
Dim sql = _
"SELECT CreditCardNumber FROM Customers WHERE CustomerID = @CustID"

...

myCommand.Parameters.Add("@CustID", <customerID>)

Dim reader as SqlDataReader = myCommand.ExecuteReader()

If reader.Read() Then
  ’Ok, let’s decrypt this data!  First, read the data into a byte array
  Dim encData() as Byte = reader.GetSqlBinary(0).Value
  
  ’Convert byte array into string
  Dim encString as String = System.Text.Encoding.UTF8.GetString(encData)
  
  ’Creating an instance of the RC4Encrypt class
  Dim rc4 As New main.rc4encrypt 

  ’Set the secret key and data to encrypt
  rc4.Password = <YourSecretKey> & <customerID>
  rc4.PlainText = encString

  ’Get the decrypted results back as a string
  Dim CCN As String = rc4.EnDeCrypt()

  ’Work with the data!
  ...
End If

 ここでは、暗号化の場合と同じ手順を逆に繰り返します。まず、バイト配列として格納されている、データベース内の暗号化された値を読み取ります。このバイト配列を、文字列に変換します。この暗号化文字列を、暗号化の際に使用したものと同じ共有キー/ソルト値と共に、main.rc4encryptクラスに設定します。最後に、EnDeCrypt()を呼び出して値を復号し、文字列としてプレーンテキスト値を返します。この時点から、復号されたデータを必要に応じて操作できます。

暗号化:実装の価値はあるか?

 2005年冬に発行されたTechNet Magazineの「SQL Questions & Answers」セクションでは、データの暗号化について述べられていました。SQL Server 2000内のテーブルデータの暗号化に関する読者からの質問に対して、編集者(Nancy Michell)は次のように答えています。

「データベース管理者が、SQL Serverデータベース内のデータを暗号化することがあります。一般に、これは道を誤っています。安全なボックスを構築し、監査を行い、厳密なアクセス制御でアクセスを保護するならば、実際には、データ自体を暗号化する意味はありません。データの暗号化には、オーバーヘッド、ソート、ストアドプロシージャなど、多くの問題が伴います。」

 データベースのコンテンツを暗号化するには、コーディング時間、デバッグ時間、および労力を余分に要しますが、それだけの価値はあるのでしょうか。それはひとえに、アプリケーションの要件、データの機密性、顧客や上司の要望にかかっています。データの暗号化は、システムに対して新たな保護のレイヤを追加しますが、明らかな弱点がいくつかあります(たとえば、対称暗号化の場合、ハッカーの手に共有キーが渡ってしまうと暗号化は役に立ちません。また、秘密キーをなくした場合は暗号化データを利用できなくなります)。コンテンツを暗号化すると、パフォーマンスオーバーヘッドが生じ、クエリーも問題になってきます。たとえば、クレジットカードの有効期限が3か月以内であるすべての顧客を返すクエリーを作成するものとします。クレジットカード情報が暗号化されていて、各顧客に対して一意の共有キーを使用している場合、このようなクエリーを作成することはできません(代わりに、すべてのレコードをアプリケーションに読み込み、クレジットカードの有効期限を復号し、フィルタ処理によって、有効期限が3か月以内のものを探し出す必要があります)。

 また、Nancyが指摘するように、T-SQLステートメントでは暗号化データを処理できません。暗号化されていないデータを使用すれば、ストアドプロシージャ内で簡単に調査、編集、および実行時判断を行うことができます。暗号化データの場合、アプリケーションレイヤで実際の暗号化/復号処理が発生するため、そうはいきません(もちろん、暗号化するデータをT-SQLステートメントで使用する必要がない場合や、多くのユーザーが関係するレポートでクエリーを行う必要がない場合もあります。そうした場合、欠点の多くは問題ではなくなります)。

 このような問題があるにもかかわらず、顧客や上司は、新たなセキュリティレイヤをシステムに追加せよと強行に主張するかもしれません。そのときは、難攻不落のセキュリティ手段など決して存在しないことを教え、新しいセキュリティレイヤを追加した場合に考えられる不利益を指摘してあげましょう。

まとめ

 この記事では、実際に暗号化データを格納するというアプローチで機密データのセキュリティを強化する方法を説明しました。特にこの記事では、対称キー暗号化アルゴリズムのRC4を使用して、ASP.NETアプリケーションのデータを暗号化/復号する方法に注目しました。この結果、ハッカーがデータベースサーバーに侵入しても、重要なデータは保護されます。もちろん、完全なセキュリティ機構などというものはありません。その目的はあくまでも、ハッカーが機密情報を入手することを、可能な限り困難にすることです。非常に重要なデータベース情報(財務データや社会保障番号など)のコンテンツを暗号化することは、このような強化手段の1つです。

 では、ハッピープログラミング!

著者紹介

Scott Mitchell(Scott Mitchell)


関連記事
  • 親子データを表示するタブ付きインターフェイスの作成
  • IEで.NET Windowsフォームコントロールをホストする
  • ASP.NETにおけるOracleのデータキャッシング
  • Office Web Componentsを利用してASP.NETでグラフを作成する
  • Webカスタムコントロールの作成


  • 関連テーマ
  • Microsoft
  • 暗号化
  • SQL Server


  • ★最新トップニュース
    国内 検索から1クリックで動画を Blog 形式で見れる「YouTube2.in」画像のある記事(Webビジネス 8月22日 12:50)
    永上裕之氏は2008年8月21日、YouTube の検索から1クリックで動画を見れる、「YouTube2.in 〜 サクサク動画検索しちゃう」を開始した。
    海外 Amazon.com、新たなクラウド型ストレージサービスを開始(Webビジネス 8月22日 12:30)
    Amazon.com は21日、『Amazon Elastic Compute Cloud』(EC2) の一環として、新しいクラウド型ストレージ サービス『Amazon Elastic Block Store』(EBS) を正式に開始した。
    海外 『iPhone』ユーザーが Apple を告訴、通信事業者にも波及か(携帯・ワイヤレス 8月22日 12:20)
    ネットワーク接続性が約束通りの期待を満たしていないとして、『iPhone 3G』ユーザーが Apple を訴えた。同様の訴訟が、移動体通信事業者にも及ぶ可能性もある。
    国内 モバゲータウン、10代の4割以上が利用――ネットエイジア調べ(Webマーケティング 8月22日 12:10)
    ネットエイジア株式会社は、携帯電話ユーザーに対し「ケータイの利用コンテンツ」に関しての実態調査をモバイルリサーチにて実施、2008年8月22日、調査結果を発表した。
    海外 無線送電システムの開発に取り組む Intel(Webテクノロジー 8月22日 12:10)
    Intel が無線送電システムの開発に取り組んでいる。送電可能距離は約60cm ないし90cm だが、この距離はまだ延びる可能性があり、人などの障害物は迂回して送電できるという。
    トピックス
    > オススメのIT系求人情報【毎週月曜日更新】
    footer_301.gif


    リサーチ
    > デイリーリサーチDLサイト
    > OnlineResearchPortal (リサーチデータバンク)
    > モバイルリサーチ with goo
    footer_301.gif
    キーワード
    > iPhone > Youtube
    > Google > モバイルノート
    > 半導体 > ウィルコム
    > テーマ一覧はこちら
    footer_301.gif
    セミナー情報
    > 第1回インターネットコムマーケティングセミナー「新規クライアントを効率的に獲得する Web マーケティング手法とは」(3月26日)多数のご参加ありがとうございました
    footer_301.gif
    デベロッパー
    > DevX
    > CodeGuru
    > developer.com
    footer_301.gif
    j.i.c.ブログ
    ブログ一覧
    ベンチャー専門家の目利きブログ「なぜこの企業は伸びるのか?」 【ベンチャー専門家の目利きブログ「なぜこの企業は伸びるのか?」】
    「ASP・SaaS型サービス提供会社を成功へ導く徹底サポート!」/株式会社ディーネット(8月22日)
    最新テクノロジーの意外な処方箋 【最新テクノロジーの意外な処方箋】
    帰ってきたWeb 2.0 予測市場(8月22日)
    データメーション 【データメーション】
    中古家電買い取りサイトはどこがベストか?(8月21日)
    デスマーチからの脱却 【デスマーチからの脱却】
    30min. iPhoneアプリリリース(8月18日)
    エンジニアの独り言 【エンジニアの独り言】
    技術進歩の落とし穴!?誰のためにシステムを作っていますか?(8月18日)
    Skypeブログ出張版 【Skypeブログ出張版】
    パナソニックWiFiフォン購入でSkype1ヶ国プランプレゼント(8月13日)
    footer_301.gif
    最新コラム一覧
    IT マネジメント IT マネジメント

    「クラウドコンピューティング」がくだらない理由(8月22日)
    CodeGuru CodeGuru

    AndroidでのGoogle APIを使った地図表示(8月22日)
    最新アフィリエイト事例にみる成功の法則 最新アフィリエイト事例にみる成功の法則

    報酬設定と成果地点の最適化について(8月22日)
    最新ハイテク講座 最新ハイテク講座

    太陽光発電だけじゃない!環境にやさしいエコ発電の最新事情(8月22日)
    週刊-サイト別アクセス状況データ 週刊-サイト別アクセス状況データ

    ビデオリサーチインタラクティブ調査(月間インターネットオーディエンスデータ)(8月21日)
    気になるオープンソースソフトウェア 気になるオープンソースソフトウェア

    オープンソースのアプリケーションサーバー Apache Geronimo その3(8月21日)
    「IT の耳」 「IT の耳」

    【書評】『暗号解読』―ロゼッタストーンから量子暗号まで―(8月21日)
    検索エンジンマーケティング 検索エンジンマーケティング

    EZweb ではキャリア非公式サイトがクリックされる3つの理由(8月21日)
    百式のネットビジネス研究 百式のネットビジネス研究

    あるテーマに沿ったリンクを集めて共有するのに便利そうな「Agglom」(8月21日)
    Eメールマーケティング事情 Eメールマーケティング事情

    メルマガからメールマーケティングへ(8月20日)
    footer_301.gif
    専門チャンネル
    > セキュリティチャネル > テレコムチャネル
    > サーチエンジンウォッチ
    footer_301.gif
    海外のインターネットコム アメリカ韓国ドイツトルコ
    関連企業のサイト:ストックフォト イラスト ネットストリート ホテル予約サイト タウン情報 出張 事業継承 シミュレーション トランクルーム 優待映画チケット 田舎暮らしガイド オリジナルデザインTシャツ ニタコエ
    Copyright 2008 Jupitermedia Corporation All Rights Reserved. http://www.internet.com/
    space.gif space.gif