Здравствуйте, уважаемые форумчане! Модератор, если разместил тему не в нужном разделе - заранее прошу прощения и прошу переместить куда следует.
Только вникаю в тему программирования на java.
Стоит задача имитировать https запросы приложения Android.
Столкнулся с функцией кодирования строк (насколько я понял):
| Код | import android.content.Context; import android.content.Intent; import android.content.SharedPreferences; import android.util.Base64; import android.util.Log; import java.io.File; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; import java.util.GregorianCalendar; import java.util.Iterator; import java.util.UUID; import javax.crypto.Mac; import javax.crypto.spec.SecretKeySpec; import org.json.JSONException; import org.json.JSONObject;
private String base64encryptedConfirmationHash(long time, String tag) { String sSecret = this.mInfo.optString("identity_secret"); if (sSecret == null) { return ""; } byte[] secretBytes = Base64.decode(sSecret.getBytes(), 0); int dataLen = 8; if (tag != null) { if (tag.length() > 32) { dataLen = 8 + 32; } else { dataLen = 8 + tag.length(); } } byte[] dataBytes = new byte[dataLen]; int i = 8; while (true) { int i2 = i - 1; if (i <= 0) { break; } dataBytes[i2] = (byte) ((int) time); time >>>= 8; i = i2; } if (tag != null) { System.arraycopy(tag.getBytes(), 0, dataBytes, 8, dataLen - 8); } SecretKeySpec signKey = new SecretKeySpec(secretBytes, "HmacSHA1"); try { Mac mac = Mac.getInstance("HmacSHA1"); mac.init(signKey); return percentEncodeUrlUnsafeChars(Base64.encodeToString(mac.doFinal(dataBytes), 2)); } catch (NoSuchAlgorithmException e) { return null; } catch (InvalidKeyException e2) { return null; } }
public String getTaggedConfirmationUrlParams(String tag) { if (base64encryptedConfirmationHash(TimeCorrector.getInstance().currentTimeSeconds(), tag) == null) { return ""; } return String.format("p=%s&a=%s&k=%s&t=%d&m=android&tag=%s", new Object[]{getUniqueIdForPhone(), getId(), base64encryptedConfirmationHash(TimeCorrector.getInstance().currentTimeSeconds(), tag), Long.valueOf(TimeCorrector.getInstance().currentTimeSeconds()), tag}); }
|
Входящими параметрами функции являются unix время и tag, который мне пока не известен.
Результатом функции является : LYBIvTb2vdxjsMZvTD%2bpcxPN6%2f8%3d (url decode: LYBIvTb2vdxjsMZvTD+pcxPN6/8=)
В итоге запрос имеет вид: ?op=allow&p=android:af740075-ecf8-485c-bffd-d4c1343203db&a=76261198246295941&k=LYBIvTb2vdxjsMZvTD%2bpcxPN6%2f8%3d&t=1449703601&m=android&tag=allow&cid=8984774&ck=980894818334077389
В подобных запросах меняются следующие параметры: cid=8984774&ck=980894818334077389
Просьба помочь в понимании процесса кодирования и расшифровки ключа для возможности имитировать запрос.
|