Я пытаюсь преобразовать эту функцию PHP:
string hash_hmac ( string $algo , string $data , string $key [, bool $raw_output = false ] )
где algo = SHA-256, данные = дд-мм-гггг, ключ = «пароль»
Я написал код с Message Digest, который вычисляет sha-256 на конкатенации data + key, но вывод отличается от вывода php-функции.
Любая помощь для записи этой функции PHP в Android Java?
Фактически я установил для String key персональный пароль, а для String — дату. Теперь, когда я запускаю приложение и генерирую hmacsha256, который добавляю к получению URL-адреса, значение hmacSha256, которое я печатаю, отличается от формы, которую hmacSha256 вычисляет в iOS.
Я использовал этот код, адаптированный из одного ответа:
String PRIVATE_KEY = (String) "asf";
String dateInString = "2015-04-26"; // Start date
String sdf = new SimpleDateFormat("yyyy-MM-dd").format(new Date());
String Token = (String) sdf + PRIVATE_KEY;
private static String toHexString(final byte[] bytes) {
final Formatter formatter = new Formatter();
for (final byte b : bytes) {
formatter.format("%02x", b);
}
return formatter.toString();
}
public static String hmacSha256(final String PRIVATE_KEY, final String sdf) {
try {
final Mac mac = Mac.getInstance("HmacSHA256");
mac.init(new SecretKeySpec(PRIVATE_KEY.getBytes(), "HmacSHA256"));
return toHexString(mac.doFinal(sdf.getBytes()));
}
catch (final Exception e) {
// ...
}
return PRIVATE_KEY;
}
Но когда я печатаю hmacSha256 (sdf, PRIVATE_KEY), мой вывод: 76934121da91e03df3ca531057cdca132ebc7fe37ba60fc12da11dba285e3ba2
и это значение отличается от hmacSha256, сгенерированного iOS. Что здесь не так.
Вот как я сделал реализацию HmacSHA256:
private static String toHexString(final byte[] bytes) {
final Formatter formatter = new Formatter();
for (final byte b : bytes) {
formatter.format("%02x", b);
}
return formatter.toString();
}
public static String hmacSha256(final String key, final String s) {
try {
final Mac mac = Mac.getInstance("HmacSHA256");
mac.init(new SecretKeySpec(key.getBytes(), "HmacSHA256");
return toHexString(mac.doFinal(s.getBytes()));
}
catch (final Exception e) {
// ...
}
}
Других решений пока нет …