1

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

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

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

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

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

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

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

非常感谢提前,丹

4

4 回答 4

2

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

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

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

附带说明一下,奇怪的是,每次都使用相同的加密字符串不会导致区分大小写的搜索。根据“Miller”的加密版本搜索 Miller 不会返回记录。只有当您将数据保存为小写时,您才有机会忽略区分大小写。例如休眠:Restrictions.eq(fieldname, value).ignoreCase()。这将使您的搜索字符串与小写字符串的加密版本匹配,无论您搜索的是什么区分大小写。

于 2014-08-19T22:58:26.657 回答
0

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

于 2012-03-17T16:56:06.330 回答
0

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

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

于 2012-03-17T16:56:47.560 回答
0

如果我理解正确的问题,您必须查看哈希方法,例如在Java Cryptography Architecture中,或者这个主题可能对您有用(我没有深入了解它)

于 2012-03-17T16:59:45.187 回答