none
スクリプトを暗号化して実行することはできますか? RRS feed

  • 質問

  • シェルスクリプトに暗号化されたデータの復号化ロジックを入れたいのですが、
    シェルスクリプトのままだと、誰もが見れてしまうので復号化ロジックや秘密キーがダダ漏れ
    になってしまいます。
    スクリプトコード自体を暗号化してそのまま実行することはできますか?
    WSHだと、Windows Script Encoderというツールがあるらしくスクリプトコードを暗号化し、
    暗号化されたスクリプトがそのまま実行できるようなのですが、これと同じようなことを
    PowerShellでやりたいのです。

     

    2014年3月6日 13:03

回答

  • 回答でなくて申し訳ありませんが、一点確認させてください。
    「かんたんに見られることを抑止したい」であり、「少しツールを使えば見られることはあきらめる」ぐらいの要求なのでしょうか?

    比較対象としてあげられている Windows Script Encoder は、「かんたんに見られることを抑止したい」をかなえていますが、そのツールを知っていれば元に戻すこともかんたんにできるという現実がありますので、「少しツールを使えば見られることはあきらめる」ことが前提となります。
    そのスクリプトを実行できる以上、どのように復号しないといけないかをシステムは知っていることになります。つまり、元に戻せる材料はそのシステムに存在するわけですので、それを利用すれば、誰でも復号できます。
    ゆえに、暗号化できたとしても、完全に隠すことはできない、採用する技術によって求められる知識・時間は変動するものの、最終的にはアルゴリズムや秘匿したい情報を知ることができるということにご留意ください。
    (これは難易度・時間などの差はあれど、exe 形式のアプリケーションであっても同じです)

    さて、exe に押し込むというアプローチを開発されている方がおられるようですが、どの程度安全なのかまでは確認していません。
    http://rkeithhill.wordpress.com/2010/09/21/make-ps1exewrapper/

    2014年3月6日 13:49

すべての返信

  • 回答でなくて申し訳ありませんが、一点確認させてください。
    「かんたんに見られることを抑止したい」であり、「少しツールを使えば見られることはあきらめる」ぐらいの要求なのでしょうか?

    比較対象としてあげられている Windows Script Encoder は、「かんたんに見られることを抑止したい」をかなえていますが、そのツールを知っていれば元に戻すこともかんたんにできるという現実がありますので、「少しツールを使えば見られることはあきらめる」ことが前提となります。
    そのスクリプトを実行できる以上、どのように復号しないといけないかをシステムは知っていることになります。つまり、元に戻せる材料はそのシステムに存在するわけですので、それを利用すれば、誰でも復号できます。
    ゆえに、暗号化できたとしても、完全に隠すことはできない、採用する技術によって求められる知識・時間は変動するものの、最終的にはアルゴリズムや秘匿したい情報を知ることができるということにご留意ください。
    (これは難易度・時間などの差はあれど、exe 形式のアプリケーションであっても同じです)

    さて、exe に押し込むというアプローチを開発されている方がおられるようですが、どの程度安全なのかまでは確認していません。
    http://rkeithhill.wordpress.com/2010/09/21/make-ps1exewrapper/

    2014年3月6日 13:49
  • Azuleanさん

    レスありがとうございました。

    作ろうとしているスクリプトは社内の特定ユーザー向けなのですが、データベースにアクセス
    するため接続文字列、ユーザー、パスワードの情報を設定ファイル(xml)に記述する予定です。
    しかし、これらの情報は公開したくないため、設定ファイル上は暗号化文字列として設定し、
    スクリプト内部で復号化して使おうとしています。しかし、スクリプトが読める人が見れば
    簡単に情報が復元できてしまいます。かといって、Webシステムにするほど大げさなこともしたくない...

    と、このようなシチュエーションなので、

    >「かんたんに見られることを抑止したい」であり、「少しツールを使えば見られること
    >はあきらめる」ぐらいの要求なのでしょうか?

    に対しては、ツールを使えば見られるというレベルは抑止したいです。少なくともパソコン
    上級者ぐらいのレベルでは見られないようにし、「暗号解読ハッカーレベルの人間が社内にいれば
    その場合はあきらめる」ぐらいの要求です。

    Windows Script Encoder は、使ったことがなくてよくわかってなかったのですが、
    それなりの知識のある人が使えば、元のスクリプトが簡単に復元できてしまうということですね。
    これでは非常にマズイです。

    お教えいただいたリンクも見ましたが、私のレベルでは正直何をやってるんだか、あまりよく
    わかりませんでしたm(__)m

    なんか、あれこれいろんなことを考えるより、素直にC#で書いてEXEにした方が楽な気がしてきました。

    2014年3月6日 16:10
  • それなりの知識のある人が使えば、元のスクリプトが簡単に復元できてしまうということですね。
    これでは非常にマズイです。

    (中略)

    なんか、あれこれいろんなことを考えるより、素直にC#で書いてEXEにした方が楽な気がしてきました。

    先にも書きましたが、exe 形式のアプリケーションであっても難易度・時間の差はあれど、解読可能です。
    特に .NET アプリケーションは中間言語である MSIL にコンパイルするだけなのでツールを使って C# コードまで復元することが可能です。
    (参考: http://www.atmarkit.co.jp/fdotnet/dotnettips/1055ilspy/ilspy.html

    .NET アプリケーションでは難読化というソリューションもありますが、あくまで「難読化」です。
    読みづらくする、ツールに対してある程度抵抗力を持たせることはできますが、その気になれば読めます。

    結局はどこまでやるかなのですが、接続情報を保護したいのであれば、Web サービスのようにあるマシンしか接続情報を持たず、クライアントはそのサービスを利用して情報をやりとりするといったことになるのでしょう。
    2014年3月6日 21:34
  • はい、その手の逆コンパイルツールがあることは知っております。
    かなり前ですが、Javaのclassファイルをナントカっていうツールで逆コンパイルして解析
    したことがありますが結構大変でした。
    「そこまでして解析されたら諦めます」ベルでOKです(そんな人は社内にもいないと思いますので)。

    >結局はどこまでやるかなのですが、接続情報を保護したいのであれば、Web サービスのように
    >あるマシンしか接続情報を持たず、クライアントはそのサービスを利用して情報をやりとりする
    >といったことになるのでしょう。

    そうですね。ただ、EXEを逆コンパイルして解析できるぐらいの人の対策のために
    Webマシンを立ててサービスを提供するといったような大げさなことはしたくないですね。
    提供するのが一部の人たちだけですし、そんな工数もないんです。
    EXE解析できるようなレベルの人がいたらWebマシンに不正アクセスして情報を盗み出す方が
    よっぽど早いと思いますので、どっちもどっち(トレードオフ)ということになると思います。

    今回は、シェルスクリプトでやることは諦めたいと思います。

    2014年3月7日 0:13
  • Java の当時の難易度と今の C# の難易度は違うかもしれないので一度実験しておくとよいと思います。

    懸念するとすれば、接続文字列は単なる文字列なのでコードを読み解く必要はない、つまりハードルは少し下がるということでしょうか。これも問題ないレベルであれば受容でよいと思います。

    2014年3月7日 3:27
  • Azuleanさん

    >Java の当時の難易度と今の C# の難易度は違うかもしれないので一度実験しておくとよいと思います。
    そうですね、昔のJavaのときはアセンブラのようなソースでしたが。。。
    どの程度のレベルのソースになるのか一度見てみたいとおもいます。

    いろいろとアドバイスありがとうございました。

    2014年3月7日 8:18