カテゴリー別アーカイブ: セキュリティ

SHA-2を用いたメッセージダイジェスト出力

 ※v8.0からサポートされました。

新しい暗号化及びメッセージダイジェストのアルゴリズムとして、AESとSHA-2(SHA-224/SHA-256/SHA-384/SHA-512)が使用できるようになりました。

{curl 8.0 applet}
{curl-file-attributes character-encoding = “shift-jis”}

{import * from CURL.CRYPTO.MSG-DIGEST}

{let dg224:SHA-224-Digester = {new SHA-224-Digester}}
{let dg256:SHA-256-Digester = {new SHA-256-Digester}}
{let dg384:SHA-384-Digester = {new SHA-384-Digester}}
{let dg512:SHA-512-Digester = {new SHA-512-Digester}}

{let vb:VBox = {VBox}}
{let txt:TextField = {TextField value = “input”} }
{let cbx:ComboBox = {ComboBox
                        value = “SHA-224-Digester”,
                        “SHA-224-Digester”,
                        “SHA-256-Digester”,
                        “SHA-384-Digester”,
                        “SHA-512-Digester”
                    }
}

{let cb:CommandButton = {CommandButton
                            label = “execute”,
                            {on Action do
                                {if cbx.value == “SHA-224-Digester” then
                                    {vb.add {dg224.digest-from-string txt.value}  }
                                 elseif cbx.value == “SHA-256-Digester” then
                                    {vb.add {dg256.digest-from-string txt.value}  }
                                 elseif cbx.value == “SHA-384-Digester” then
                                    {vb.add {dg384.digest-from-string txt.value}  }
                                 elseif cbx.value == “SHA-512-Digester” then
                                    {vb.add {dg512.digest-from-string txt.value}  }
                                 else
                                    {vb.add “miss”}
                                }
                            }
                        }
}

{value
    {vb.add cbx}
    {vb.add {HBox txt ,cb}}

    vb
}

 


SHA-2を用いたメッセージダイジェスト出力 サンプル: http://developers.curlap.com/curl/v8/digester.curl

 


 

共通鍵暗号方式 (AES)についてはこちらを参照してください。

 http://developers.curlap.com/re-reference/34-security/119-encrypt.html

 

 

コードサイニング署名

Curlはローカルアクセスなど自由度が高いため、ユーザが信頼できるアプレット(アプリケーション)として公開するため、Curlアプレットに対してコードサイニング署名をすることができます。これにより信頼性の高いアプリケーションとしての証明と、改ざん検証ができます。

手順は以下のようになります。

  1. 信頼できるCA(ベリサインGlobalSignなど)に申請し、CA証明書を発行してもらいます。Curlではpkcs#12形式をサポートしております。
  2. Curl IDE上で、上記CA証明書を使ってCurlアプレットに署名します。(IDEでメニューの「プロジェクト」→「ターゲット設定の編集」→「ターゲット」タブからターゲットを選択し、「設定」ボタンを押下します。「ディプロイコードを署名」にチェックを入れ、「証明書のロケーション」(上記CA証明書ファイル)を指定します。ここまで指定できたらすべてOKでポップアップ画面を閉じます。
  3. メニュー「プロジェクト」から「XXXXのディプロイメント」を行いますと、起動フィイル(start.curl)とマニフェストファイル(manifest.mcurl)にcurl-file-signatureというブロックが追加されます(署名されます)。
  4. この上記のディプロイメントされたファイルをwebサーバ上にアプリケーションを公開します。(とりあえずテスト的にローカルに作られた上記ファイルを起動して、テストできます。)
  5. start.curlを実行すると、「Curlアプレットのセキュリティ警告ポップアップ」が表示されます。(※「常に許可」ボタンを押下しますと、コントロールパネルの証明書の欄に登録されます。)

 

 

共通鍵暗号方式

Curlで共通鍵暗号方式を利用して、暗号化・復号化を実現するには、EncryptStream(暗号)、DecryptStream(複合)クラスを利用します。(これらを利用する際は、CURL.CRYPTO.CIPHERパッケージをインポートしてください。) Curlでは共通鍵暗号方式のアルゴリズムとして、トリプルDES, rc2, rc4、AES AES-128、AES-192、AES-256 AESはVer.8より提供開始 }をサポートしています。詳細はAPIドキュメントのAlgorithmクラスを参照ください。このアルゴリズムを共通鍵のSessionKeyクラスに指定し、EncryptStreamを利用して暗号化します。詳細は以下のサンプルを御覧下さい。

{import * from CURL.CRYPTO.CIPHER}

{define-proc public inline {encrypt
                                         algorithm:Algorithm = Algorithm.des3,
                                         common-key:{Array-of byte}, 
                                         message:{Array-of byte},
                                         out:ByteOutputStream
                                    }:void
    {with-open-streams enc-out =
        {TranscodingTextOutputStream
            {EncryptStream
                out,
                {SessionKey.from-bytes algorithm, common-key}
            },
            CharEncoding.utf8,
            false
        }
     do
        {for i:int = 0 below message.size do
            {enc-out.write-one message[i] asa byte}
        }
    }
}

{define-proc public inline {decrypt
                                         algorithm:Algorithm = Algorithm.des3,
                                         common-key:{Array-of byte}, 
                                         in:ByteInputStream
                                    }:String
    def buf = {StringBuf}
    {with-open-streams dec-in =
        {TranscodingTextInputStream
            {DecryptStream
                in,
                {SessionKey.from-bytes algorithm, common-key}
            }
        }
     do
        {for b in {dec-in.read} do
            {buf.append b asa char}
        }
        {return {buf.to-String}}
    }
}

{do
    def secret-file = “secret-file”
    def key = {{Array-of byte}
                   1,2,3,4,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0, 0,0,0,0,0,0
               }

    || 暗号
    {encrypt 
        key, ||キー 
        {{Array-of byte} 50, 51, 52},
        {write-open-byte {url secret-file}}
    }
    
    {decrypt 
        key, ||キー 
        {read-open-byte {url secret-file}}
    }
}

 

 


 Ver.8よりAESを指定することができます。

 Algorithm.aes-128-cbc、 Algorithm.aes-192-cbc、 Algorithm.aes-256-cbc

上記サンプルにてアルゴリズム、キー長を変更することにより確認することができます。

 


 

ちなみに、以下の拡張ライブラリを利用するとさらに簡単に暗号化できます。

拡張ライブラリ(暗号・複合API)

 

Basic認証・Digest認証

CurlでBasic認証(ベーシック認証)・Digest認証(ダイジェスト認証)を行うには、まずはWebサーバの設定を行います。例えば、Apacheであれば.htaccessファイル、Tomcatではweb.xmlの設定を行います。

これらの設定後、Curlからこのサイトへアクセスすると認証用ダイアログが表示されます。もしこの認証用ダイアログを利用したくない場合は、set-http-authenticationプロシージャを利用します。サイトアクセス前にこのプロシージャの引数にURLプリフィックス, ユーザ名・パスワードを指定して実行します。

このプロシージャの利用方法はBasic認証でもDigest認証でも変わりません。

また、認証エントリの一覧を取得するために、get-http-authentications、認証エントリからの削除を行うために、clear-http-authenticationが用意されています。

 

 

SHA-1を用いたメッセージダイジェスト出力

ハッシュ関数について、「MD5を用いたメッセージダイジェスト出力」で紹介したものに加えて、SHA-1をCurlにて利用する方法をご紹介いたします。MD5のメッセージダイジェストの長さは128ビットですが、SHA-1は160ビットとなっています。

まず、SHA-1を利用するには、CURL.CRYPTO.MSG-DIGESTパッケージをimportします。

{import * from CURL.CRYPTO.MSG-DIGEST”}

SHA-1-Digesterクラスのインスタンスを生成し、digest-from-stringからMsgDigestオブジェクトを取得することができます。

{value
    let digester:SHA-1-Digester = {SHA-1-Digester}
    {digester.digest-from-string “abc”} & “”
}

実行結果

A9993E364706816ABA3E25717850C26C9CD0D89D

 

MD5を用いたメッセージダイジェスト出力

認証やデジタル署名などでよく使われるMD5という、入力値などに対して128ビットのハッシュ値を出力するハッシュ関数(一方向関数)があります。

CurlにてMD5を利用する場合、標準APIとしては提供されていません。ただし、MD5を利用してメッセージダイジェストを出力するサンプルは、以下のディレクトリに格納されていますので、それをもとにご紹介いたします。

C:\Program Files\Curl Corporation\Surge\7\docs\default\examples\dguide\dll-interface.zip(Windowsの場合)

こちらからもダウンロードできるようにしておきました。

まず、MD5を利用するには、以下のようにMD5.scurlをロードし、MD5のパッケージをimportします。 

{import * from MD5, location = “MD5.scurl”}

MD5-Digesterクラスのインスタンスを生成し、digest-from-stringからMsgDigestオブジェクトを取得することができます。

{value
    let digester:MD5-Digester = {MD5-Digester}
    {digester.digest-from-string “abc”} & “”
}

実行結果

900150983CD24FB0D6963F7D28E17F72