0

メッセージと秘密鍵を使用して Java プログラムに署名を生成させようとしています。私の C# プログラムは、同じメッセージと秘密鍵を使用して同じトークンを生成する必要があります。

ただし、生成されるトークンが異なるため、何かが正しく機能していません。

これら 2 つのプログラムの違いと、一致するキーを生成しない理由を特定できる人はいますか?

Java コード:

this.algorithm = "hmacSHA256";
private static Mac mac;
String message = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum id urn";
String secretKey = "5771CC06-B86D-41A6-AB39-9CA2BA338E27";

if( mac == null ) {
    mac = Mac.getInstance(algorithm);
    SecretKeySpec secret = new SecretKeySpec(secretKey.getBytes("US-ASCII"), 
        mac.getAlgorithm());
    mac.init(secret);
}
this.signature = new String(Base64.encodeBase64(mac.doFinal(message.getBytes("US-ASCII"))));

C# コード:

string message = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum id urn";
string secret = "5771CC06-B86D-41A6-AB39-9CA2BA338E27";

secret = secret ?? "";
var encoding = new System.Text.ASCIIEncoding();
byte[] keyByte = encoding.GetBytes(secret);
byte[] messageBytes = encoding.GetBytes(message);
using (var hmacsha256 = new System.Security.Cryptography.HMACSHA256(keyByte))
{
    byte[] hashmessage = hmacsha256.ComputeHash(messageBytes);
    return Convert.ToBase64String(hashmessage);
}
4

2 に答える 2

2

C# で HMACSHA256 ハッシュ アルゴリズムを使用していることがわかります。しかし、Java で使用しているアルゴリズムは何ですか?

于 2013-09-26T15:35:02.897 に答える
1

あなたの問題は暗号化とは何の関係もありません。メイン関数でスタンドアロンで実行するようにコードを少し変更しましたが、どちらも同じ結果を返します。

rO7Ly1WIR+d4AGXaDvIOYH3vVm2NvyFwbr3E3rQaw4I=

私のJavaコードは次のとおりです。

package com.test.so;

import java.io.UnsupportedEncodingException;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;

import javax.crypto.Mac;
import javax.crypto.spec.SecretKeySpec;

import org.apache.commons.codec.binary.Base64;

public class MessageHashTest {

    public static void main(String[] args) throws NoSuchAlgorithmException, UnsupportedEncodingException, InvalidKeyException {
        String algorithm = "hmacSHA256";
        String message = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum id urn";
        String secretKey = "5771CC06-B86D-41A6-AB39-9CA2BA338E27";

        Mac mac = Mac.getInstance(algorithm);
        SecretKeySpec secret = new SecretKeySpec(secretKey.getBytes("US-ASCII"), 
        mac.getAlgorithm());
        mac.init(secret);
        String signature = new String(Base64.encodeBase64(mac.doFinal(message.getBytes("US-ASCII"))));
        System.out.println(signature);
    }
}

私の.NETコードは次のとおりです。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Threading.Tasks;

namespace MessageHashTest
{
    class Program
    {
        static void Main(string[] args)
        {
            string message = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Vestibulum id urn";
            string secret = "5771CC06-B86D-41A6-AB39-9CA2BA338E27";

            var encoding = new System.Text.ASCIIEncoding();
            byte[] keyByte = encoding.GetBytes(secret);
            byte[] messageBytes = encoding.GetBytes(message);
            using (var hmacsha256 = new HMACSHA256(keyByte))
            {
                byte[] hashmessage = hmacsha256.ComputeHash(messageBytes);
                Console.WriteLine(Convert.ToBase64String(hashmessage));
            }
        }
    }
}

コードで考えられる問題は次のとおりです。

  • Java での MAC インスタンスの再利用。複数回使用できるかどうかはわかりません。新しいメッセージに対して適切に初期化されていない可能性があります。
  • secret = secret ?? "":なぜそれが必要なのですか?どこかで秘密を漏らした?間違ったシークレットでハッシュを作成していませんか?
于 2013-09-26T15:58:15.770 に答える