据我所知,Java应用程序中没有显式调用任何方法来在访问列时对列进行加密或解密.相反,加密似乎是在用于访问数据的ORM内自动发生的(Hibernate).我发现了一个名为/entities/TABLENAME.hbm.xml的XML文件,我认为该文件是Hibernate对该列的模型定义. XML文件中的相关行如下:
<property name="columnname" type="stringEncrypted"> <column name="TBL_COLUMNNAME" not-null="false" unique="false" sql-type="VARCHAR(255)"/> </property>
请注意,类型是stringEncrypted. stringEncrypted的定义似乎位于/entities/global/User.hbm.xml中,如下所示:
<typedef name="stringEncrypted" class="org.jasypt.hibernate.type.EncryptedStringType"> <param name="encryptorRegisteredName">stringEncrypter</param> </typedef>
然后stringEncrypter设置显示在/webapp/resources/spring/CompanyName-encryption.xml中,如下所示(当然,已清理):
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd"> <beans> <bean id="stringEncryptor" class="org.jasypt.encryption.pbe.StandardPBEStringEncryptor"> <property name="password"> <value>PASSWORD</value> </property> <property name="algorithm"> <value>PBEWithMD5AndDES</value> </property> <property name="saltGenerator"> <ref bean="fixedStringSaltGenerator"/> </property> </bean> <bean id="fixedStringSaltGenerator" class="org.jasypt.salt.FixedStringSaltGenerator"> <property name="salt"> <value>SALTSALTSALTSALTSALTSALTSALTSALTSALT</value> </property> </bean> <bean id="hibernateEncryptor" class="org.jasypt.hibernate.encryptor.HibernatePBEStringEncryptor"> <property name="registeredName"> <value>stringEncrypter</value> </property> <property name="encryptor"> <ref bean="stringEncryptor" /> </property> </bean> </beans>
因此,我认为这告诉我,该列是使用密码PASSWORD和SALTSALTSALTSALTSALTSALTSALTSALTSALT盐加密PBEWithMD5AndDES方法加密的.那么,问题是我如何解密.NET中的列值?
到目前为止,我最好的领先是由汤姆亨德利发布的PKCSKeyGenerator class.使用它,我在.NET中尝试了以下内容:
string encryptedInput = "mG5bz6duwBL3jVCLKyI8Zw=="; // This is an encrypted value copied from MySQL Workbench string saltString = "SALTSALTSALTSALTSALTSALTSALTSALTSALT"; string keyString = "PASSWORD"; byte[] saltBytes = new byte[saltString.Length * sizeof(char)]; System.Buffer.BlockCopy(saltString.ToCharArray(),saltBytes,saltBytes.Length); PKCSKeyGenerator crypto = new PKCSKeyGenerator( keyString,// key saltBytes,// salt 13,1); // Magic numbers. I don't really get 'em. ICryptoTransform ct = crypto.Decryptor; byte[] cipherBytes = Convert.FromBase64String(encryptedInput); byte[] clearBytes = ct.TransformFinalBlock(cipherBytes,cipherBytes.Length); string clearString = Encoding.Unicode.GetString(clearBytes);
当我运行这个时,我得到:
CryptographicException: Bad Data
我查看了其他解密方法,扫描了Java代码以查找可能正在使用的任何其他代码,并修改了PKCSKeyGenerator中的参数,但我没有取得任何进展.我似乎无法使这个解密工作.你有什么建议吗?提前致谢.
解决方法
PKCSGenerator
类似乎正确地实现了非标准的“PBEwithMD5andDES”密钥推导算法.您缺少的部分是迭代次数,您在问题中显示为13. (对于DES,segment参数应该为1;对于三重DES,这将增加,具体取决于使用的键控选项.)
在我检查的版本中,Jasypt的密钥派生算法的默认迭代次数仅为1000(StandardPBEByteEncryptor.DEFAULT_KEY_OBTENTION_ITERATIONS的值).
由于您要删除加密,这应该足以让您继续使用.NET.如果您想保留加密,我强烈建议您迁移加密列,以便它们使用PKCS#5中的PBKDF2和AES进行加密.如果你这样做,我会使用更多的迭代,可能是50,000到100,000,具体取决于你可用的资源.
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。