2013-03-07 86 views
3

我真的百思不得其解,为什么编码值是不同的的Base64编码值是不一样

继承人的完整代码

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:[[email protected] 
key- Base64 after :[[email protected] 
+1

您正在获得默认的Java Object.toString()行为。你的问题是Java,而不是加密。尝试使用'Arrays.toString(Base64.encode(key.getEncoded()))' – rossum 2013-03-07 17:11:31

+0

这是您在绝对java初学者中可能会遇到的混淆类型,而不是像您那样经验丰富的人。 – 2013-03-07 23:50:55

回答

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()))); 
6

Base64.encode返回char[] - 事实上你得到两个单独的数组并没有告诉你数组中的值是不同的,只是它们是两个单独的实例。

你需要做的是比较实际阵列什么返回检查,如果他们是它们含有相同的编码值:

boolean areEqual = Arrays.equals(Base64.encode (keytemp.getEncoded()), 
           Base64.encode (key.getEncoded())); 
0

嗯,在我看来,你是显示不支持的结果输出您正在绘制的结论。

下面的行不打印键的Base64表示:

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

它打印什么是由所述的Base64转换返回的字节[]实例调用的toString()的结果。在byte []上调用toString()并不会将byte []转换为其字符串表示形式。

因此,您可以支持结果的唯一结论是,两个byte []实例在您的JVM内部不是同一个对象实例,这看起来可以根据您的操作进行合理化。

如果你想通过字节比较它们的内容,逐字节[]实例比较,你可以使用

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

或者到Base64编码比较编码的钥匙:

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

如果要比较字符串表示形式,需要将字节[]转换为字符串,这很容易看出,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)); 

希望这有助于。