Java中字符串加密的常量结果

时间:2012-03-17 16:52:18

标签: java encryption jasypt

我想加密一个字符串(用户的电子邮件)并始终获得相同的结果字符串 我将用户的电子邮件保存为登录用户名,因为我在该字段上进行了搜索(例如,用户的电子邮件在注册时已经存在。或者选择用户的密码,其中email ='abc')

对于密码加密和解密,我使用Jasypt来完成这项工作。

字符串加密,我可以加密和解密,但我还没有找到解密常数的方法。

我已经搜索了很多解决方案,但似乎没有解决我的问题。我可能没有使用正确的关键字,我不熟悉加密。

我不必使用Jasypt进行字符串加密。任何将“hello@hello.com”转换为“@ ABC#EFG”的内容,每次都会很棒。

我还尝试根据字符串,首字母等的长度使用不同的加扰算法来加扰字符串的字节。不幸的是,当我在MySQL中保存加密字符串时它停止工作。根据我的理解,最终具有MySQL不喜欢的Unicode值的每个字节都没有正确保存(当我使用测试类中存在的字符串时它工作正常,但是当我实际保存加密的字符串并从DB)

任何想法 - 解决方案的链接?

非常感谢Dan,

4 个答案:

答案 0 :(得分:2)

您需要使用固定盐生成器。

http://www.jasypt.org/api/jasypt/1.8/org/jasypt/salt/FixedStringSaltGenerator.html

基本上,当您设置算法或密码等内容时,您将在固定盐生成器中生成并使用另一个密码。从那里开始,每次加密字符串时都会得到相同的结果。

作为旁注,每次奇怪地使用相同的加密字符串不会导致区分大小写的搜索。正在搜索米勒的加密版本"米勒"赢回不了记录。只有当您将数据保存为小写,才有可能忽略区分大小写时。例如,hibernate:Restrictions.eq(fieldname,value).ignoreCase()。这将使您的搜索字符串与小写字符串的加密版本匹配,无论您搜索的是什么区分大小写。

答案 1 :(得分:0)

看看任何哈希方法。可以使用MessageDigest获取MD5,SHA-1,SHA-256。只需获取原始字符串的字节数(使用getBytes("UTF-8")),您应该总是得到相同的结果。

答案 2 :(得分:0)

为什么不简单地使用字符串的MD5哈希?只需确保将所有字母字符转换为大写或小写,因为这将导致不同的输出。

查看Apache Commons Codec库。特别是DigestUtils中的MD5算法。 Apache Commons Codec库中还有各种其他摘要,如SHA等。

答案 3 :(得分:0)

如果我理解正确的问题,你必须看到哈希方法,例如在Java Cryptography Architecture或者this topic可能对你有用(我没有看到它)