SHA256:Swift 和 Java 的输出不同?
SHA256: different output in Swift and Java?
我正在尝试使用 SHA256 对字符串进行编码。我知道输出应该是什么样子。
这是我从工作中得到的 Java:
string = "1234nonce=1234"
SHA256 Hash from string in Java:
string.digest() =
[-29, -80, -60, 66, -104, -4, 28, 20, -102, -5, -12, -56, -103, 111,
-71, 36, 39, -82, 65, -28, 100, -101, -109, 76, -92, -107, -103, 27,
120, 82, -72, 85]
现在我需要在 Swift 中得到相同的结果:
func sha256() {
let string = "1234nonce=1234"
let intArray = [UInt8](string.utf8)
let data = Data(bytes: intArray)
var hash = [UInt8](repeating: 0, count: Int(CC_SHA256_DIGEST_LENGTH))
data.withUnsafeBytes {
_ = CC_SHA256([=13=], CC_LONG(data.count), &hash)
}
print(hash)
return Data(bytes: hash)
}
但结果是这样的:
[218, 207, 142, 73, 87, 235, 210, 73, 201, 67, 19, 33, 57, 146, 69, 48, 51, 56, 0, 212, 172, 114, 118, 31, 102, 19, 175, 51, 153, 230, 143, 67]
Java中第一个结果是如何产生的,你可以在最后一个答案中看到。
(那里,nonce + data
对应"1234nonce=1234"
)
我想知道我是否做错了什么。非常感谢任何形式的帮助。
简答
您使用 Swift 语言实现的 SHA-256 哈希算法似乎是正确的。
长答案
不仅包含SHA-256哈希算法实现,还包含计算签名的HMAC-SHA-512算法实现(?)。
总而言之,如果只需要SHA-256算法,请查看以下草案 Java实现:
package com.thecompany.test;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
class Program {
public static void main(final String[] args) throws NoSuchAlgorithmException {
// Input.
final String input = "1234nonce=1234";
// Processing.
final byte[] output = sha256(input);
// Output.
System.out.printf("Signed output: %s.%n", Arrays.toString(output));
final List<Integer> unsignedOutput = unsignedIntStream(output)
.boxed()
.collect(Collectors.toList());
System.out.printf("Unsigned output: %s.%n", unsignedOutput);
}
private static IntStream unsignedIntStream(final byte[] array) {
return IntStream
.range(0, array.length)
.map(index -> Byte.toUnsignedInt(array[index]));
}
private static byte[] sha256(final String text) throws NoSuchAlgorithmException {
final MessageDigest digest = MessageDigest.getInstance("SHA-256");
return digest.digest(text.getBytes(StandardCharsets.UTF_8));
}
}
程序产生以下输出:
Signed output: [-38, -49, -114, 73, 87, -21, -46, 73, -55, 67, 19, 33, 57, -110, 69, 48, 51, 56, 0, -44, -84, 114, 118, 31, 102, 19, -81, 51, -103, -26, -113, 67].
Unsigned output: [218, 207, 142, 73, 87, 235, 210, 73, 201, 67, 19, 33, 57, 146, 69, 48, 51, 56, 0, 212, 172, 114, 118, 31, 102, 19, 175, 51, 153, 230, 143, 67].
希望对您有所帮助。
我正在尝试使用 SHA256 对字符串进行编码。我知道输出应该是什么样子。 这是我从工作中得到的 Java:
string = "1234nonce=1234"
SHA256 Hash from string in Java:
string.digest() =
[-29, -80, -60, 66, -104, -4, 28, 20, -102, -5, -12, -56, -103, 111,
-71, 36, 39, -82, 65, -28, 100, -101, -109, 76, -92, -107, -103, 27,
120, 82, -72, 85]
现在我需要在 Swift 中得到相同的结果:
func sha256() {
let string = "1234nonce=1234"
let intArray = [UInt8](string.utf8)
let data = Data(bytes: intArray)
var hash = [UInt8](repeating: 0, count: Int(CC_SHA256_DIGEST_LENGTH))
data.withUnsafeBytes {
_ = CC_SHA256([=13=], CC_LONG(data.count), &hash)
}
print(hash)
return Data(bytes: hash)
}
但结果是这样的:
[218, 207, 142, 73, 87, 235, 210, 73, 201, 67, 19, 33, 57, 146, 69, 48, 51, 56, 0, 212, 172, 114, 118, 31, 102, 19, 175, 51, 153, 230, 143, 67]
Java中第一个结果是如何产生的,你可以在最后一个答案中看到nonce + data
对应"1234nonce=1234"
)
我想知道我是否做错了什么。非常感谢任何形式的帮助。
简答
您使用 Swift 语言实现的 SHA-256 哈希算法似乎是正确的。
长答案
总而言之,如果只需要SHA-256算法,请查看以下草案 Java实现:
package com.thecompany.test;
import java.nio.charset.StandardCharsets;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
class Program {
public static void main(final String[] args) throws NoSuchAlgorithmException {
// Input.
final String input = "1234nonce=1234";
// Processing.
final byte[] output = sha256(input);
// Output.
System.out.printf("Signed output: %s.%n", Arrays.toString(output));
final List<Integer> unsignedOutput = unsignedIntStream(output)
.boxed()
.collect(Collectors.toList());
System.out.printf("Unsigned output: %s.%n", unsignedOutput);
}
private static IntStream unsignedIntStream(final byte[] array) {
return IntStream
.range(0, array.length)
.map(index -> Byte.toUnsignedInt(array[index]));
}
private static byte[] sha256(final String text) throws NoSuchAlgorithmException {
final MessageDigest digest = MessageDigest.getInstance("SHA-256");
return digest.digest(text.getBytes(StandardCharsets.UTF_8));
}
}
程序产生以下输出:
Signed output: [-38, -49, -114, 73, 87, -21, -46, 73, -55, 67, 19, 33, 57, -110, 69, 48, 51, 56, 0, -44, -84, 114, 118, 31, 102, 19, -81, 51, -103, -26, -113, 67].
Unsigned output: [218, 207, 142, 73, 87, 235, 210, 73, 201, 67, 19, 33, 57, 146, 69, 48, 51, 56, 0, 212, 172, 114, 118, 31, 102, 19, 175, 51, 153, 230, 143, 67].
希望对您有所帮助。