使用JavaEncryptor的ESAPI对称加密

使用JavaEncryptor的ESAPI对称加密,java,eclipse,encryption-symmetric,esapi,Java,Eclipse,Encryption Symmetric,Esapi,我正在测试ESAPI中的基本内容,我偶然发现并复制并粘贴了代码(同时在Eclipse的'src'目录中导入ESAPI 2.1.0 jar文件、ESAPI.properties和validation.properties) 修改了教程中的代码: import org.owasp.esapi.crypto.CipherText; import org.owasp.esapi.crypto.PlainText; import org.owasp.esapi.errors.EncryptionExcep

我正在测试ESAPI中的基本内容,我偶然发现并复制并粘贴了代码(同时在Eclipse的'src'目录中导入ESAPI 2.1.0 jar文件、ESAPI.properties和validation.properties)

修改了教程中的代码:

import org.owasp.esapi.crypto.CipherText;
import org.owasp.esapi.crypto.PlainText;
import org.owasp.esapi.errors.EncryptionException;
import org.owasp.esapi.reference.crypto.JavaEncryptor;

public class ESAPIsymEncTester {

    public static void main(String[] args) throws EncryptionException{
    
        String myplaintext = "My plaintext";
        
            CipherText ciphertext =
                    JavaEncryptor.getInstance().encrypt( new PlainText(myplaintext) );
        PlainText recoveredPlaintext = JavaEncryptor.getInstance().decrypt(ciphertext);
            assert myplaintext.equals( recoveredPlaintext.toString() );
            
            System.out.println("recovered plaintext: " + recoveredPlaintext.toString());
    }
}
但是,当我使用Java 1.8在Eclipse Luna中运行此程序时,我得到以下堆栈跟踪:

Exception in thread "main" org.owasp.esapi.errors.EncryptionException: Encryption failure: Invalid key exception.
at org.owasp.esapi.reference.crypto.JavaEncryptor.encrypt(JavaEncryptor.java:526)
at org.owasp.esapi.reference.crypto.JavaEncryptor.encrypt(JavaEncryptor.java:338)
at com.fate.engine.test.ESAPIsymEncTester.main(ESAPIsymEncTester.java:15)
Caused by: java.security.InvalidKeyException: Invalid AES key length: 96 bytes
at com.sun.crypto.provider.AESCipher.engineGetKeySize(AESCipher.java:495)
at javax.crypto.Cipher.passCryptoPermCheck(Cipher.java:1062)
at javax.crypto.Cipher.checkCryptoPerm(Cipher.java:1033)
at javax.crypto.Cipher.init(Cipher.java:1367)
at javax.crypto.Cipher.init(Cipher.java:1301)
at org.owasp.esapi.reference.crypto.JavaEncryptor.encrypt(JavaEncryptor.java:504)
... 2 more
我不确定这是JavaEncryptor.java代码中的错误,还是从ESAPI.properties文件中提取了一些配置错误的内容

我通过运行JavaEncryptor并复制/粘贴生成的密钥/salt来替换主密钥和salt

如果它是一个bug,我会发电子邮件给ESAPI的人,让他们澄清我如何修复它,因为我查看了JavaEncryptor代码,但并不完全清楚所有的代码都来自哪里

Encryptor.MasterKey=WppLubGgsc/p6HhvcPf2LA==

Encryptor.MasterSalt=YokRN9mjMUTZspEbzBY90NA6EC8=

Encryptor.PreferredJCEProvider=

Encryptor.EncryptionAlgorithm=AES

Encryptor.CiphertTransformation=AES/CBC/PKCS5P

加密机。密码模式。组合模式=GCM、CCM、IAPM、EAX、OCB、CWC

Encryptor.cipher_modes.additional_allowed=CBC

Encryptor.EncryptionKeyLength=128

Encryptor.ChooseIVMethod=random

加密机.fixedIV=0x000102030405060708090a0b0c0d0e0f

Encryptor.CipherText.useMAC=true

Encryptor.PlainText.overwrite=true

Encryptor.HashAlgorithm=SHA-512*****

Encryptor.HashIterations=1024

Encryptor.DigitalSignatureAlgorithm=SHA1withDSA

Encryptor.DigitalSignatureKeyLength=1024

Encryptor.RandomAlgorithm=SHA1PRNG

Encryptor.CharacterEncoding=UTF-8

Encryptor.KDF.PRF=HmacSHA1*****


您忘记将日志中最重要的部分放在问题中:

Dec 11, 2015 8:05:24 AM org.owasp.esapi.reference.JavaLogFactory$JavaLogger log
WARNING: [SECURITY FAILURE Anonymous:null@unknown -> /JavaEncryptor] Encryption key length mismatch. ESAPI.EncryptionKeyLength is 128 bits, but length of actual encryption key is 24 bits.  Did you remember to regenerate your master key (if that is what you are using)???
这是一条线索,说明图书馆希望你做些什么

在我看来,您可能在
esapi.properties
中设置了如下默认加密程序属性:

Encryptor.MasterKey=owasp1
Encryptor.MasterSalt=testtest
JavaEncryptor
有一个main方法,可以为您生成有效的属性。在eclipse中或通过命令行运行它。它将为您提供要在
esapi.properties
中替换的值,如下所示:

Dec 11, 2015 8:10:25 AM org.owasp.esapi.reference.JavaLogFactory$JavaLogger log
OFF: [SECURITY AUDIT Anonymous:null@unknown -> /SecurityProviderLoader] No Encryptor.PreferredJCEProvider specified.
SecurityConfiguration for Encryptor.EncryptionKeyLength not an integer in ESAPI.properties. Using default: 128
Generating a new secret master key
    use '-print' to also show available crypto algorithms from all the security providers
SecurityConfiguration for Encryptor.EncryptionKeyLength not an integer in ESAPI.properties. Using default: 128

Copy and paste these lines into your ESAPI.properties

#==============================================================
Encryptor.MasterKey=qW0Qw+8eb1Zu1MBv5djwqA==
Encryptor.MasterSalt=b0VappFU1Hd6LjIt+TGYqQlfrdU=
#==============================================================

一旦我这样做了,您的代码示例就可以正常运行了

以下是我的建议。。。从GitHub获取ESAPI.properties的测试版本(wget应该可以工作,您可以使用'git'或从浏览器中保存),将其放置到位,然后首先按原样使用。如果失败了,那么经过调整的代码中就存在问题。如果有效,则表明ESAPI.properties文件中存在问题。许多人已经就可能出现的错误提出了应该查找的内容,但是差异应该足够小,您应该能够通过在src/TEST/resources/esapi/esapi.properties中区分您的版本和测试版本来发现它们。(顺便说一句,生产版本位于'configuration/esapi/esapi.properties'下,由于pom.xml中的一些错误,我不知道如何修复,因为我不是Maven专家。)

如果你有进一步的问题,请通过我的Gmail帐户与我联系,你可以通过谷歌很容易地找到我的名字和术语“OWASP”。一旦我们找到了一个适合您的答案,您或我都可以将答案发回Stack Overflow,但我不经常访问这个论坛,无法定期监视它。(不过,仔细想想,我可能会收到回复通知。)

希望这有帮助


-凯文w。wall/ESAPI crypto developer和合作项目负责人

我目前没有日志记录器工作,所以我只是在Eclipse中将跟踪转储到控制台,但MasterKey和MasterSalt(格式)与运行JavaEncryptor main时的输出完全一样。但事实上,您已经运行了它,这意味着我在esapi.properties中遇到了一些问题。我现在只需要找到它。请确保您没有输入两次主钥匙和主盐。我没有两个主钥匙/主盐,因此其他东西正在工作。我会继续努力的,因为我有时间。欢迎任何进一步的想法来指导我的啄食。添加了esapi.properties中的加密设置。星星是我在过去某个时候调整过的。是的,这也是我的下一步。是重建一个原始的测试环境。在测试小节中,我在更广泛的项目中对此进行了测试,但这不是一个可行的测试环境,因为我在esapi.properties中调整了比我记忆中更多的位置。我作为vanland也在esapi开发人员/用户邮件列表中。我想我会先在我们的服务器上区分文件,看看我在过去几个月里做了什么改变。