我正在处理的应用程序需要将String转换为SHA-256哈希,但由于它是J2ME,我无法访问MessageDigest的全部功能。
我尝试过BouncyCastle库但是当我将结果哈希与在线页面的结果进行比较时,值是不同的。
另一种让我知道哈希未正确创建的方法是在HTTP请求中将其发送到我的服务器,如果我可以登录,那么哈希是正确创建的,否则就是格式错误。
我被告知我应该实现自己的SHA-256 enconding但到目前为止我还没有找到示例或算法本身,只有来自Wikipedia page的伪代码,更糟糕的是我不知道根本没有密码学经验。
我是否必须创建自己的实现?或者我还有机会避免这种情况并使用不同的库吗?
以下是我尝试使用BouncyCastle的当前代码:
String[] stringArray = (String[]) dotREZApi.getCurrentRequest().getResponseHeaders().get("X-Session-Id");
String tmpSessionId = stringArray[0];
byte[] input = null;
try {
input = new String("X-Session-Sig" + tmpSessionId + "test").getBytes("UTF-8"); // String that will be converted
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
System.out.println("Unsupported encoding exception");
e.printStackTrace();
}
// trying to create a key, i don't know if this is right I just did this because I needed a key
byte[] key = new byte[4];
int tmpInt = new Random().nextInt();
key[0] = (byte)(tmpInt >> 24);
key[1] = (byte)(tmpInt >> 16);
key[2] = (byte)(tmpInt >> 8);
key[3] = (byte)(tmpInt);
Digest digest = new SHA256Digest();
HMac hmac = new HMac(digest);
hmac.init(new KeyParameter(key)); // maybe this is the problem? the documentaiton never states where do I get this key or how to generate it
hmac.update(input, 0, input.length);
byte[] output = new byte[digest.getDigestSize()];
hmac.doFinal(output, 0);
dotREZApi.setSessionSig(new String(Hex.encode(output)));
我得到的结果与我从site获得的结果相比,但我没有得到匹配。
行input = new String("X-Session-Sig" + tmpSessionId + "test").getBytes("UTF-8");
是我构造字符串的地方,然后将其转换为byte []以转换为SHA-256哈希,其中tmpSessionId是我从HTTP请求获得的值。生成的哈希将在将来的请求中发送。
答案 0 :(得分:0)
最后我没有使用BouncyCastle。
我最终使用了J2ME中的MessageDigest,虽然它没有相同的方法,但我可以让它工作:
byte[] input = null;
try {
input = new String("X-Session-Id" + tmpSessionId + "test").getBytes("UTF-8");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
System.out.println("Unsupported encoding exception");
e.printStackTrace();
}
MessageDigest messageDigest;
byte[] output = new byte[32]; // since SHA256 hash is 256 bits = 32 bytes
try {
messageDigest = MessageDigest.getInstance("SHA-256");
messageDigest.update(input, 0, input.length);
messageDigest.digest(output, 0, 32); // same
} catch (NoSuchAlgorithmException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (DigestException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
我希望BouncyCastle的这个替代方案也适用于其他人。
如果有人可以将此问题标记为重复,因为我的问题出在BouncyCastle上,并且正在寻找替代方案,因为BouncyCastle是大多数网页推荐的内容。