2015-05-19 285 views
1

在BAM配置文件中的WSO2 ESB(4.8.1)中,當我導出它(BAM配置文件)時,我注意到密碼已加密。我發現,如果我將有私鑰和公鑰,我可以加密/解密的密碼,所以我寫這篇文章:WSO2使用公鑰私鑰加密/解密密碼(字符串)

import org.apache.commons.codec.binary.Base64; 
import org.bouncycastle.jce.provider.BouncyCastleProvider; 

import javax.crypto.Cipher; 
import java.io.FileInputStream; 
import java.security.*; 
import java.security.cert.Certificate; 

public class Main { 
    public static void main(String[] argv) throws Exception { 
     Security.addProvider(new BouncyCastleProvider()); 
     FileInputStream is = new FileInputStream("wso2carbon.jks"); 

     KeyStore keystore = KeyStore.getInstance(KeyStore.getDefaultType()); 
     keystore.load(is, "wso2carbon".toCharArray()); 

     String alias = "wso2carbon"; 

     Key key = keystore.getKey(alias, "wso2carbon".toCharArray()); 
     if (key instanceof PrivateKey) { 
      Certificate cert = keystore.getCertificate(alias); 

      PublicKey publicKey = cert.getPublicKey(); 

      String dataToBeEncrypted = "admin"; 
      String adminToDecrypted = "kuv2MubUUveMyv6GeHrXr9il59ajJIqUI4eoYHcgGKf/BBFOWn96NTjJQI+wYbWjKW6r79S7L7ZzgYeWx7DlGbff5X3pBN2Gh9yV0BHP1E93QtFqR7uTWi141Tr7V7ZwScwNqJbiNoV+vyLbsqKJE7T3nP8Ih9Y6omygbcLcHzg="; 

      Cipher cipher = Cipher.getInstance("RSA"); 

      cipher.init(Cipher.ENCRYPT_MODE, publicKey); 
      String encryptedData = Base64.encodeBase64String(cipher.doFinal(dataToBeEncrypted.getBytes())); 
      System.out.println("Encrypted Data: " + encryptedData); 

      Cipher dipher = Cipher.getInstance("RSA"); 

      dipher.init(Cipher.DECRYPT_MODE, key); 
      System.out.println(new String(dipher.doFinal(Base64.decodeBase64(encryptedData)))); 

     } 
    } 
} 

它工作正常,becasue「管理員」進行加密和解密後。但是,當我複製此加密值,並希望將其粘貼在我的BAM設定檔的密碼,ESB不能得到它,密碼爲空,並在控制檯中我得到這個:

Caused by: javax.xml.stream.XMLStreamException: ParseError at [row,col]:[1,429] 
Message: An invalid XML character (Unicode: 0x2) was found in the element content of the document. 
     at com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl.next(XMLStreamReaderImpl.java:598) 
     at com.sun.org.apache.xerces.internal.impl.XMLStreamReaderImpl.getElementText(XMLStreamReaderImpl.java:842) 
     at org.apache.axiom.util.stax.wrapper.XMLStreamReaderWrapper.getElementText(XMLStreamReaderWrapper.java:100) 
     at org.apache.axiom.om.impl.SwitchingWrapper.getElementText(SwitchingWrapper.java:962) 

第二個問題是,當我嘗試解密密碼(WSO2 ESB通過出口BAM曲線加密,並且它「adminToDecrypted」)我得到這樣的:

Exception in thread "main" javax.crypto.BadPaddingException: Decryption error 
    at sun.security.rsa.RSAPadding.unpadV15(RSAPadding.java:380) 
    at sun.security.rsa.RSAPadding.unpad(RSAPadding.java:291) 
    at com.sun.crypto.provider.RSACipher.doFinal(RSACipher.java:356) 
    at com.sun.crypto.provider.RSACipher.engineDoFinal(RSACipher.java:382) 
    at javax.crypto.Cipher.doFinal(Cipher.java:2087) 
    at Main.main(Main.java:37) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:140) 

所以,也許我做錯事或我錯過一些重要的事情。也許還有其他方法可以做到這一點。也許在WSO2回購中有一個類可以找到它的工作原理?

UPDATE

我注意到,在我的代碼我每次都獲得新的加密密碼,當我運行的代碼,但在WSO2 ESB我總是得到相同的字符串。

回答

1

當加密/編碼和解碼/解密,請嘗試以下操作:

org.wso2.carbon.core.util.CryptoUtil.getDefaultCryptoUtil().encryptAndBase64Encode(value.getBytes()) 

爲了解碼/解密,使用方法:

base64DecodeAndDecrypt() 

你必須添加一個依賴於組織.wso2.carbon.core(org.wso2.carbon.utils,嘗試這兩個)來得到這個工作(檢查你的<product>/repository/components/plugins找到正確的版本的依賴)

我不exac確定這是否適用於您的情況,但這是大多數碳基產品的做法。

+0

謝謝你,它的工作原理! – Kacu