2

エンコードされた値が異なる理由について、私は本当に困惑しています

完全なコードはこちら

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.security.Key;
import java.security.KeyStore;

import javax.crypto.KeyGenerator;
import javax.crypto.SecretKey;

import org.bouncycastle.util.encoders.Base64;

public class KeyStoreDemo {

    private static final String KEY_STORE_TYPE = "JCEKS";
    private static final String KEY_STORE_NAME = "sampleKeyStore.store";
    private static final String KEY_STORE_PASSWORD = "letmein";


    public static void main(String[] args) throws Exception {
        File storeFile = new File(KEY_STORE_NAME);
        storeFile.createNewFile();

        //Create a keystore
        createKeyStore(KEY_STORE_TYPE, storeFile,KEY_STORE_PASSWORD);

        //Generate a key and store it in keystore
        KeyStore keyStore = loadKeyStore(KEY_STORE_TYPE,storeFile,KEY_STORE_PASSWORD);      


        // Get the KeyGenerator     
        KeyGenerator keyGenerator = KeyGenerator.getInstance("AES");keyGenerator.init(128); Key keytemp = keyGenerator.generateKey();       
        System.out.println("key- Base64 before:"+Base64.encode (keytemp.getEncoded()) );
        //createSecretKeyAndStore( keyStore, keytemp, "samplekey" ,"samplepwd");
        createSecretKeyAndStore(storeFile, keyStore, KEY_STORE_PASSWORD, keytemp, "samplekey" ,"samplepwd");

        Key key = getKeyFromStore(keyStore, "samplekey", "samplepwd");
        System.out.println("key- Base64  after :"+Base64.encode (key.getEncoded()) );



    }   

    private static KeyStore createKeyStore(String keyStoreType,File keyStoreFile,String keyStorePassword) throws Exception{     

        KeyStore keyStore = KeyStore.getInstance(keyStoreType);
        keyStore.load((InputStream) null, keyStorePassword.toCharArray());

        // Write KeyStore to disk
        final FileOutputStream fileOutputStream = new FileOutputStream(keyStoreFile);

        try {
            keyStore.store(fileOutputStream, keyStorePassword.toCharArray());
            fileOutputStream.flush();
        } finally {
            fileOutputStream.close();
        }       

        return keyStore;
    }

    private static KeyStore loadKeyStore(String keyStoreType,File keyStoreFile,String keyStorePassword) throws Exception{
        KeyStore keyStore = KeyStore.getInstance(keyStoreType);
        keyStore.load((InputStream) new FileInputStream(keyStoreFile), keyStorePassword.toCharArray());     
        return keyStore;
    }



    private static void createSecretKeyAndStore(File  keyStorefile ,KeyStore keyStore,String keyStorePwd, Key key, String keyAlias ,String keyAccessPassword) throws Exception{
        keyStore.setKeyEntry(keyAlias, key, keyAccessPassword.toCharArray(), null);

        // Write KeyStore to disk
        final FileOutputStream fileOutputStream = new FileOutputStream(keyStorefile);

        try {
            keyStore.store(fileOutputStream, keyStorePwd.toCharArray());
        } finally {
            fileOutputStream.close();
        }
    }




    private static Key getKeyFromStore(KeyStore keyStore, String keyAlias,String keyAccessPassword) throws Exception {
        Key  keyFromStore = null;
        keyFromStore =  keyStore.getKey(keyAlias, keyAccessPassword.toCharArray());
        return keyFromStore;
    }   

}

結果

key- Base64 before:[B@c7e553
key- Base64  after :[B@1ac04e8
4

3 に答える 3

6

Base64.encodeを返しますchar[]- 2 つの別個の配列を取得しているという事実は、配列内の値が異なることを示しているのではなく、それらが 2 つの別個のインスタンスであることを示しています。

あなたがする必要があるのは、返された実際の配列を比較して、同じエンコードされた値が含まれているかどうかを確認することです:

boolean areEqual = Arrays.equals(Base64.encode (keytemp.getEncoded()), 
                                 Base64.encode (key.getEncoded()));
于 2013-03-07T14:02:38.023 に答える
2

それは、あなたの印刷がそうではないthe Encoded StringからtoString value of the char[] arrayです。

System.out.println("key-Base64 before:"+new String(Base64.encode(keytemp.getEncoded())));

System.out.println("key-Base64  after :"+new String(Base64.encode(key.getEncoded())) );
于 2013-03-07T17:41:13.793 に答える
0

さて、あなたが示している結果の出力は、あなたが描いている結論をサポートしていないように私には思えます。

次の行は、キーのbase64表現を出力しません。

System.out.println(Base64.encode (key.getEncoded()));

印刷されるのは、Base64変換によって返されるbyte []インスタンスでtoString()を呼び出した結果です。byte []でtoString()を呼び出しても、byte[]はその文字列表現にまったく変換されません。

結果として、結果からサポートできる唯一の結論は、2つのbyte []インスタンスがJVM内の同じオブジェクトインスタンスではないということです。これは、実行していることを考えると合理的と思われます。

byte []インスタンスの内容をバイトごとに比較して比較する場合は、次を使用できます。

Arrays.equals(tempKey.getEncoded(), key.getEncoded())

または、エンコードされたキーのBase64を比較するには:

Arrays.equals(Base64.encode(tempKey.getEncoded()), Base64.encode(key.getEncoded()))

文字列表現を比較する場合は、byte []を文字列に変換する必要があります。これは、base64がASCIIセーフ値のみを使用していることを簡単に確認できます。

String tempKeyEncoded = new String(Base64.encode(tempKey.getEncoded), "US-ASCII");
String keyEncoded = new String(Base64.encode(key.getEncoded), "US-ASCII");
System.out.println(tempKeyEncoded.equals(keyEncoded));

お役に立てれば。

于 2013-03-07T14:10:51.847 に答える