当前位置: 首页 > 知识库问答 >
问题:

在J2ME中如何将字符串转换为SHA-256哈希?

松献
2023-03-14
            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)));

input=new String(“x-session-sig”+tmpSessionId+“test”).getbytes(“utf-8”);是我构造字符串并将其转换为byte[]以转换为SHA-256散列的地方,其中tmpSessionId是我从HTTP请求中获取的值。产生的散列将在以后的请求中发送。

共有1个答案

茅桐
2023-03-14

最后我没有使用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的替代方案也适用于其他人。

 类似资料:
  • 问题内容: 我正在尝试在Android中获取字符串的SHA256。 这是我要匹配的PHP代码: 现在,在Java中,我正在尝试执行以下操作: 但这会打印出来:“ a42yzk3axdv3k4yh98g8” 我在这里做错了什么? 归功于erickson: 问题答案: PHP函数意味着它需要一个字节字符串并将其编码为十六进制数字。 在Java代码中,您尝试获取一堆随机字节,并使用平台的默认字符编码将它

  • 我已经在诺基亚开发者论坛上发布了这个问题,所以请原谅我。 我正在编写一个应用程序,它需要查找一个URL的SHA-256哈希,该URL以唯一的值键控,即。在Java ME/J2ME中最好的方法是什么?

  • 我正在尝试使用亚马逊的弹性代码转换器。这里我需要sha-256散列一个字符串;http://docs.aws.amazon.com/general/latest/gr/sigv4-create-canonical-request.html 我已经尝试了我在网上找到的任何方法,但我找不到与页面和一些在线哈希网站提供的相同的结果。 下面是要散列的字符串,您可以从上面的链接中找到; 以下是预期结果: 3

  • 问题内容: 我正在阅读有关python的新f字符串的 博客 ,它们看起来很整洁。但是,我希望能够从字符串或文件中加载f字符串。 我似乎找不到任何执行此操作的字符串方法或其他函数。 从上面我的链接中的示例: 但是,如果我有琴弦怎么办?我希望能够像这样: 事实证明,我已经可以执行类似的操作并获得性能提高。即: 问题答案: f字符串是代码。不仅以安全的方式(当然,字符串文字就是代码),而且以危险的任意代

  • 给定数字的字符串表示形式,如何将其转换为TypeScript中的类型?

  • 问题内容: 我想这些类型的值,转换的,,等多项。在JavaScript中,我们可以使用,但是PHP中有可用的类似方法吗? 问题答案: 通常不需要这样做,因为PHP在大多数情况下都会为您强制类型。对于那些你想显式转换型的情况下,_投_它: