如何在J2ME中将String转换为SHA-256哈希?

时间:2014-07-08 21:55:30

标签: java java-me cryptography sha256

我正在处理的应用程序需要将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请求获得的值。生成的哈希将在将来的请求中发送。

1 个答案:

答案 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是大多数网页推荐的内容。