2016-08-08 79 views
0

Ich arbeite an der Aktualisierung eines Passwort-Verschlüsselungs-Dienstprogramm von etwas ganz Eigengewächs zu einem um Jasypt und Bouncy Castle gebaut. Das Dienstprogramm verschlüsselt das Passwort; Die verschlüsselte Zeichenfolge wird dann in eine Eigenschaftendatei gepatcht und von einer Grails-Anwendung wieder eingelesen und entschlüsselt.Verschlüsselung fehlgeschlagen Cross Platform

Ich schrieb ein Java-Befehlszeilenprogramm zum Verschlüsseln des Kennworts. Der entsprechende Java-Code ist:

public class PasswordUtility { 
    private final String SALT = "randomstring"; 
    private final StandardPBEStringEncryptor encryptor = new StandardPBEStringEncryptor(); 

    public PasswordUtility(String seed) { 
     String password = SALT + seed; 
     encryptor.setProvider(new BouncyCastleProvider()); 
     encryptor.setAlgorithm("PBEWITHSHA256AND192BITAES-CBC-BC"); 
     encryptor.setPassword(password); 
    } 

    public String decrypt(String encryptedText) { 
     String processText = encryptedText; 
     return encryptor.decrypt(processText); 
    } 

    public String encrypt(String plainText) { 
     return encryptor.encrypt(plainText); 
    } 
} 

Die Groovy-Code ist:

class StringEncryptor { 
    String salt = "randomstring" 

    private StandardPBEStringEncryptor initCrypto(String keySplit) { 
     StandardPBEStringEncryptor pbe = new StandardPBEStringEncryptor() 
     pbe.setProvider(new BouncyCastleProvider()) 
     pbe.setAlgorithm("PBEWITHSHA256AND192BITAES-CBC-BC") 
     String cryptKey = salt + keySplit 
     pbe.setPassword(cryptKey) 
     return pbe 
    } 

    String encrypt(String keySplit, String encryptText) { 
     StandardPBEStringEncryptor pbe = initCrypto(keySplit) 
     pbe.encrypt(encryptText) 
    } 

    String decrypt(String keySplit, String encryptText) { 
     log.info encryptText 
     log.info keySplit 
     StandardPBEStringEncryptor pbe = initCrypto(keySplit) 
     pbe.decrypt(encryptText) 
    } 
} 

Wenn ich PasswordUtility lokal ausgeführt (auf einem Mac), fügen Sie die Ergebnisse in die Eigenschaftendatei und Grails lokal ausführen, das Passwort ist richtig entschlüsselt. Wenn ich PasswordUtility auf einem virtuellen RHEL-Server ausführe und die Ergebnisse in die Eigenschaftendatei einfüge, erhalte ich eine EncryptionOperationNotPossibleException. Wenn ich den Code betrachte, deutet dies darauf hin, dass die Entschlüsselung fehlgeschlagen ist - StandardPBEByteEncryptor Zeile 1055. Wenn ich eine Zeichenkette vom Mac nehme und versuche, sie auf RHEL zu entschlüsseln, gibt die Entschlüsselung eine Null zurück. Ich kann eine Zeichenfolge von einer RHEL-Box nehmen und sie auf einer anderen RHEL-Box entschlüsseln.

+0

Beachten Sie, dass die Verwendung eines anderen als Common Crypto unter OSX zu einer erheblichen Leistungseinbuße führen kann. – zaph

+0

Der Anwendungsfall ist keine Login-Authentifizierung, sondern zum Speichern von Kennwörtern, die später von der Grails-Anwendung für eine Datenbankverbindung und einen Keystore verwendet werden müssen, um eine sichere Verbindung mit anderen Elementen des Systems auf verschiedenen Servern herzustellen. – strangefreeworld

+0

http://stackoverflow.com/questions/15544266/org-jasypt-exceptions-cryptionoperationnotpossibleexeption Ich würde damit beginnen, sicherzustellen, dass Sie identische Jdk auf Mac und Linux laufen – Vahid

Antwort

0

Das Problem war, dass das Passwort mit Platzhalterzeichen versehen war. Als ich diesen Teil des Passworts in alphanumerische Zeichen (oder alphanumerische Zeichen und einen Bindestrich) änderte, funktionierte das Crypto plattformübergreifend.