Java @formula注释或sql解密函数的备选方案

Java @formula注释或sql解密函数的备选方案,java,sql,hibernate,Java,Sql,Hibernate,当我试图使用密钥(从属性文件检索)解密密码列(PWD_COL)时,Hibernate中的@Formula注释有问题 守则: @Formula("decrypt(PWD_COL, '" + MyKeys.DECRYPT_KEY + "')") private String myPwd; 我正在尝试从另一个属性文件获取解密密钥 我得到一个错误: 批注属性Formula.value的值必须是常量 表情 或者,有没有一种方法可以模拟Java中的SQL解密函数 注意:请将密码字段作为另一个值读取。这个练

当我试图使用密钥(从属性文件检索)解密密码列(PWD_COL)时,Hibernate中的
@Formula
注释有问题

守则:

@Formula("decrypt(PWD_COL, '" + MyKeys.DECRYPT_KEY + "')")
private String myPwd;
我正在尝试从另一个属性文件获取解密密钥

我得到一个错误:

批注属性Formula.value的值必须是常量 表情

或者,有没有一种方法可以模拟Java中的SQL解密函数


注意:请将密码字段作为另一个值读取。这个练习的最终目的是为了一些远不那么重要的东西,但是需要加密

公式注释的值必须是有效的SQL,因为它或多或少直接传递给基础数据库

这也解释了为什么你的想法行不通——DB将没有
MyKeys
类的概念

您可以在DB表中插入密钥,然后从
@公式中选择它,但从安全角度看,这可能不是一个特别明智的想法

您真正应该做(或实际上不应该做)的是避免存储密码,而是存储密码的哈希值,然后将这些哈希值与用户提供的任何凭据的哈希值进行比较。这将加密/散列移到Java/内存,避免了当有人窃取您的数据库、猜测弱密码或强制加密并将其全部发布到pastebin时的尴尬


干杯,

我知道这不是您想要的,但让我给您一个关于在数据库中存储密码的建议,也许您应该改变您关于如何使用密码的思维方式

由于安全原因,您不应该解密数据库上的密码,所以如果有人丢失了密码,他们应该创建一个新密码

要验证登录和相关任务,您应该从表单中获取密码,对其进行加密,并与数据库中的加密密码进行比较


如果您真的想继续这样做,请使用带有有效sql值的@formula。

感谢您的建议,但解密密码只是我一直在玩弄的一个模拟想法。最终的目的是为了其他目的。另外,当我在java类本身中给出一个静态值时,MyKeys.DECRYPT_KEY也会起作用。另外,如果您能建议一种方法来模拟java中的sql DECRYPT函数,我将不胜感激。原则上,在java中进行解密是可能的,但这取决于所使用的加密算法。用Java重新实现这一点可能太过分了,所以我建议用Java进行加密和解密。如何做到这一点是一个全新的问题-你应该能够在这里找到很多关于该领域的答案和参考资料。谢谢Igor。但是假设它不是密码字段和其他一些不那么重要的值,我们能克服这个问题吗?当然我可以比较加密的值,但最初我只是使用sql加密(使用密钥)存储在数据库中。现在,我可以在java中模拟这个sql加密函数,从表单中加密密码,然后进行比较吗?如果不重要,就不需要加密它。如果您确实需要解密,但仍然无法使用@formula,则可以编写自己的解密函数并将其添加到get中。例如:getMYPwd(){decrypt();return myPwd;}您不需要在java中模拟sql encrypt进行比较,只需在login validate sql函数的表单中的值中再次使用sql encrypt即可。