Androidネットワーク要求-signパラメータの設定方式


最近はプロジェクトをしていますが、変な要求がありました。インターフェースを呼び出す前に署名と有効時間を検証する必要があります。その場はぼんやりしています。sign署名を生成したいです。どうすればいいですか?
まず大体の考えを言います。signの生成:ルールによってキーペアとなります。つなぎ合わせはkey=value&key=value=value=value(注意:key:バックグラウンドに必要なパラメータ名、value:フロントで取得した値)とtime=システムで取得した時間&salt=fangzhoo(このパラメータは要求バックグラウンドに従って、コード化方法があります。次のステップはMD 5暗号化を行います。もし暗号化された値をすべて大文字(小文字)に変換する必要があれば、Javaで直接起動する方法があります。
次に具体的にどのように実現するかを話します。
1.数値の綴りを要求する(key=value&key=value):

String name = "   ";
String address = "  ";
String panameter = "name="+ name + "& address = "+address;
2.要求値のつづり文字列の後にタイムスタンプと特定値を追加する(バックグラウンドの要求に応じて)

//       
Date dt= new Date();
Long timeStamp= dt.getTime();
String signText = panameter +"&time="+timeStamp + "&salt=fangzhou";
3.つなぎ合わせが完了したら、signTextにurlencode符号化を行います。

try {
 String urlencoderText = URLEncoder.encode(signText,"utf-8");
} catch (UnsupportedEncodingException e) {
 e.printStackTrace();
}
注:ここでは一つの異常を投げます。直接tryでいいです。これはJava方法の直接呼び出しだけで終わります。
4.md 5の暗号化を行います。
//MD 5暗号化
String md 5 Text=md 5(urlencoderText)
md 5暗号化の方法は、ネット上にあります。直接c、vでOKです。
暗号化された値をすべて大文字(小文字)に変換するには、このようにします。
//MD 5暗号化
String md 5 Text=md 5(urlencoderText).trim().toUpperCase()
注:これは大文字に変換する方法です。
trim().toLowerCase()
これでいいですでもこれで終わりだと思いますか?あなたの考えは簡単すぎます。下が一番凹んでいます。どう表現しましたか?直接コードを入れてください。
まず、私が使っているxutilsの枠組みを説明します。

//      
params = new RequestParams(url);

//      
params.addBodyParameter("name",name);
params.addBodyParameter("address",address);
//---     ---
params.addBodyParameter("time",timeStamp+"");

//     -sign
params.addBodyParameter("sign",md5Text );
トランスコードを要求するパラメータがないのを見ましたが、やはり追加します。一つは全部なくて、むしろタイムスタンプのパラメータが多くなりました。しかし、私の上にsalt要求パラメータが暗号化されています。ここには追加されていません。トランスコード暗号化後の要求パラメータ-signを一番後ろに追加しました。
そして、正常な発注の流れで大丈夫です。
つまり、文の最後の部分-後の部分-再暗号化-再送信要求
補足知識:URLパラメータのsign署名認証について説明します。
以下の内容は他の人のブログの内容を参考にして整理します。
みんなはまず一つの問題を考えます。開放的なAPIインターフェースを書く時、データの安全性はどのように保証されますか?
まず、どのような安全性の問題があるかを見てみましょう。開放されたapiインターフェースの中で、http PostまたはGet方式を通じてサーバーを要求する時、多くの安全性の問題に直面しています。
1.ソース(身分)を要求するのは合法的ですか?
2.要求パラメータは改竄されますか?
3.要求の一意性(コピー不可)
解決策:データの通信時の安全性を保証するために、パラメータ署名の方式で関連検証を行うことができます。
カラム分析
ある[モバイル端末]に[バックグラウンドインターフェース(app)]を書いた事例を通して分析します。
クライアント:以下、アプリと略称します。
バックグラウンドインターフェース:以下、apiと略称する。
私たちはアプリで製品リストを調べて分析します。
アプリで検索ボタン=>をクリックして、アプリを呼び出して検索を行います。検索結果に戻ります。
一、検証しない方式
アプリクエリインターフェース:
アプリ呼び出し:http://api.test.com/getproducts?パラメータ1=value 1…
以上のように、このような方法は簡単で乱暴で、get products方法を呼び出して製品リスト情報を取得することができます。しかし、このような方法は非常に安全性に問題があり、何の検証も行われていません。この方法で製品リストを取得し、製品情報が漏れてしまいます。
では、どのように调节者の身分を検证しますか?パラメータの改竄を防ぐにはどうすればいいですか?
二、MD 5パラメータ署名の方式
私たちはapi検索製品のインターフェースを最適化します。
1.アプリに対応するkey、secretを割り当てる
2.Sign署名、API呼び出し時に要求パラメータに署名検証を行う必要があります。署名方式は以下の通りです。
a.要求パラメータ名に従ってすべての要求パラメータをアルファベット順に並べ替えて得る:keyvalue keyvalue文字列:arong=1、mrong=2、crong=3を並べ替える:arong=1、crong=3、mrong=2はパラメータ名とパラメータ値をつづり合わせてパラメータ文字列を得る:arong 1 crong 2。
b.secretをパラメータ文字列のヘッダに追加してMD 5を暗号化し、暗号化した文字列は大文字にする必要があります。署名Signを取得します
新しいアプリインターフェースコード:
アプリ呼び出し:http://api.test.com/getproducts?key=app_key&sign=BCG 7 C 71 CF 9 CDBBBB 88671 D 8 A 35&パラメータ1=value 1&パラメータ2=value 2…
注:secretは暗号化としてのみ使用します。データの安全を保証するために要求パラメータでは使用しないでください。
以上のように、最適化後の要求は、keyとsignパラメータが多くなります。このように要求するときは、適法なkeyと正確な署名signが必要です。このように身分認証とパラメータ改竄防止の問題を解決しました。もしパラメータを要求したら、誰かに持って行かれても大丈夫です。彼らは永遠にsecretをもらえません。secretは渡さないからです。これ以上合法的な要求を偽造することはできない。
でも…これで十分ですか?注意深い学友は発見するかもしれなくて、もし私はあなたの完備しているリンクを獲得したら、ずっとあなたのkeyとsignを使ってと同じパラメーターが正常にデータを獲得することができるならば。はい、上のような最適化だけでは足りません。。。。
要求の一意性:
他の人が要求パラメータを繰り返し使うことを防止するためには、要求に対しての唯一性を保証しなければなりません。対応要求は一回しか使えません。他の人が要求の完全なリンクを持って行っても無効です。
一意の実装:上記の要求パラメータにタイムスタンプを追加します。タイムスタンプも要求パラメータの一つとして、signアルゴリズムに加えて暗号化します。
新しいアプリインターフェース:
アプリ呼び出し:
http://api.test.com/getproducts?key=app_key&sign=BCG 7 C 71 CF 9 CDBBBB 88671 D 8 A 35×tamp=201603261407&パラメータ1=value 1&パラメータ2=value 2...
以上のように、私たちはタイムスタンプを使って要求が期限切れかどうかを検証します。これで完全な要求リンクを取られても無効です。
Sign署名のセキュリティ分析:
上記の事例を通して、安全の鍵は署名のsecretに参加することであり、全体の過程でsecretは通信に参加しないので、secretが漏れないように保証すれば、要求は偽造されないことが分かります。
締め括りをつける
上述したSign署名の方式は情報の改竄と偽造をある程度防止でき、通信の安全を保障します。ここではMD 5を使って暗号化しています。もちろん実際の使用中に、RSA、SHAなどの暗号化アルゴリズムは実際の需要に応じてカスタマイズできます。参考にしていただければと思いますが、どうぞよろしくお願いします。