AndroidでSHA256ハッシュを生成しようとしています。次に、ASP.NET Web API Webサービスに渡して、そこでハッシュを比較します。そのため、Androidでハッシュを作成する必要があります。これにより、ASP.NETで同じ入力が与えられると、同等のハッシュが生成されます。私は自分が間違っていることを理解しようとして髪を引っ張っています。
これがAndroidコードです:
public String computeHash(String input) throws NoSuchAlgorithmException{
MessageDigest digest = MessageDigest.getInstance("SHA-256");
digest.reset();
try{
digest.update(input.getBytes("UTF-8"));
} catch (UnsupportedEncodingException e){
e.printStackTrace();
}
byte[] byteData = digest.digest(input.getBytes());
StringBuffer sb = new StringBuffer();
for (int i = 0; i < byteData.length; i++){
sb.append(Integer.toString((byteData[i] & 0xff) + 0x100, 16).substring(1));
}
return sb.toString();
}
サーバー上のコードは次のとおりです(c#):
private static string ComputeHash(string input, HashAlgorithm algorithm)
{
Byte[] inputBytes = Encoding.UTF8.GetBytes(input);
Byte[] hashedBytes = algorithm.ComputeHash(inputBytes);
StringBuilder sb = new StringBuilder();
for (int i = 0; i < hashedBytes.Length; i++)
{
sb.Append(String.Format("{0:x2}", hashedBytes[i]));
}
return sb.ToString();
}
PDATE:これが修正されたAndroid/Java実装です(ありがとうNikolay Elenkov):
public String computeHash(String input) throws NoSuchAlgorithmException, UnsupportedEncodingException{
MessageDigest digest = MessageDigest.getInstance("SHA-256");
digest.reset();
byte[] byteData = digest.digest(input.getBytes("UTF-8"));
StringBuffer sb = new StringBuffer();
for (int i = 0; i < byteData.length; i++){
sb.append(Integer.toString((byteData[i] & 0xff) + 0x100, 16).substring(1));
}
return sb.toString();
}
Javaコードが間違っています:入力バイトを2回追加しています。これを一度に計算する場合は、digest(bytes)
のみを呼び出すか、digest()
after update(bytes)
;
Androidアプリ用のKotlinバージョンを探していました。
見つかりませんでした。これが私が思いついたものです:
fun String.getSha256(): String {
val digest = MessageDigest.getInstance("SHA-256").apply { reset() }
val byteData: ByteArray = digest.digest(this.toByteArray())
return StringBuffer().apply {
byteData.forEach {
append(((it.toInt() and 0xff) + 0x100).toString(16).substring(1))
}
}.toString()
}