Goで実行されているサービスを更新する

Goでのプログラミングは大好きですが、何よりもRaspberry Piのgobotでプログラミングするのが好きです。 コードの変更ごとに、コードの更新に関連する退屈な操作のために一定の時間が必要です。 Filezillaはプロセスの実行中に実行可能ファイルへの書き込みを拒否するため、最初にプロセスを停止する必要があります。SFTPを介して新しい実行可能ファイルをダウンロードして開始します(これは退屈なだけでなく、プロセスが停止するとさらに10〜20秒のダウンタイムが発生します)。



Goで通常のWeb向けに開発する場合、同様の状況に悩まされます。 コードを非常に頻繁に更新する必要があるのはgobotであり、これは開発スタイルに関連しており、自由時間に喜びをもたらしています。 新しいパッケージの開発により、Goで記述されたコードの更新がより簡単かつ迅速になりました。



次に、パッケージの使用方法と動作を説明します。



go get github.com/CossackPyra/updater
      
      





Goにアップデータをインストールしたこのコマンドで、次のコマンドを使用してコマンドラインにツールをインストールすることもできます。



 go get github.com/CossackPyra/updater/pyra-poster
      
      





更新機能を備えたWebサービスの例を次に示します。



 package main import ( "fmt" "io" "net/http" "os" "github.com/CossackPyra/updater" ) func main() { http.HandleFunc("/", handle_def) os.Mkdir("tmp", 0700) u1 := updater.UpdaterServer("tmp", []byte("1234567890123456"), os.Args[0]) http.Handle("/updater-me", u1) http.ListenAndServe(":9999", nil) } func handle_def(w http.ResponseWriter, r *http.Request) { fmt.Println("def ", r.Method) io.WriteString(w, "v 24\n") io.WriteString(w, r.URL.Path) println(r.URL.Path) }
      
      





プログラムを更新する機能を追加するのは、次の3行です。



  "github.com/CossackPyra/updater" ... u1 := updater.UpdaterServer("tmp", []byte("1234567890123456"), os.Args[0]) http.Handle("/updater-me", u1)
      
      





この場合、すべてが16バイトのキー[]バイト( "1234567890123456")で暗号化され、 31323334353637383930313233343536はその16進表現です。 new-serviceは新しい実行可能ファイルで、これは古いプロセスを更新するコマンドです。



 pyra-poster 31323334353637383930313233343536 new-service http://127.0.0.1:9999/updater-me
      
      





どのように機能しますか?



すべてのコードは280行に収まります。 コードに自信があり、すぐに理解できます。 私は自分の暗号化アルゴリズムの暗号強度と、そのようなことをどのように確認できるかについて完全には確信が持てないので、あなたと議論することに興味があります。



updater.UpdaterServerでハンドラーを初期化すると、16バイトのランダムシーケンスが生成されます(rand1)。 コードを更新するには、ハンドラーに対して2つのリクエストを行う必要があります。 最初のGET要求は、これらのランダムな16バイト(rand1) を受け取ります。 ランダムな16バイト(rand1)とシークレットパスワード(key1)を使用して送信された実行可能ファイルをAESアルゴリズムで暗号化し、POSTメソッドを使用して暗号プログラムを送信します



まず、次のレシピに従ってバッファにデータが入力されます。

-ランダムな20バイト(これはrand1ではなく、rand0-現時点ではまったく使用されていません)。

-20バイト-sha1実行可能ファイルのハッシュ。

-「pyra-poster」-バイトのシーケンス、プロトコルの名前。

-6バイト(1-int16リトルエンディアン、0-int32リトルエンディアン)-プロトコルバージョン。

- 実行可能ファイル自体。



このガンマ関数は AES ブロック暗号 (key1、rand1)によって取得され xorメソッドを使用して、このバッファーにスーパーインポーズされます。 結果は、POSTメソッドを使用してハンドラーに送信される暗号文です。



復号化用のサーバーでは、AES色域(key1、rand1)がシーケンスにスーパーインポーズされ、「pyra-poster」(1,0)ヘッダーがチェックされ、実行可能ファイルが一時フォルダーに保存され、ハッシュがsha1アルゴリズムを使用して計算され、ヘッダーのsha1と比較されます。 ハッシュが等しい場合、これがサービスの所有者によって作成された本物のファイルであると高い確率で仮定できます。



rand1サービスの更新後、サービスは変更されるため、暗号文を傍受したため、再ロードできません。 key1を計算し、rand1を持ち、ヘッダー「pyra-poster」(1,0)の特性を知ることも、実行可能ファイルを持つことも非常に困難です。



16バイト(128ビット)のkey1は、コードを追加変更することなく32バイト(256ビット)に置き換えることができます。 ほとんどのWebブラウザは、AES 256ビット暗号化を使用しています。



健康に使用してください。



All Articles