Encrypt and decrypt a password in Java
我想在Java中加密和解密密码,并以加密的形式存储到数据库中。如果它是开源的,那就太好了。有什么建议/建议吗?
- 唯一的建议是不要使用加密。使用哈希…可能要加点盐。
- @尼桑:你有什么能让我更好理解的例子吗?
- 使用mindrot.org/projects/jbcrypt执行此任务
- 请参阅密码加密了解原因。
这是我使用MD5加密的算法。它返回加密的输出。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| public class CryptWithMD5 {
private static MessageDigest md ;
public static String cryptWithMD5 (String pass ){
try {
md = MessageDigest. getInstance("MD5");
byte[] passBytes = pass. getBytes();
md. reset();
byte[] digested = md. digest(passBytes );
StringBuffer sb = new StringBuffer();
for(int i =0;i <digested. length;i ++){
sb. append(Integer. toHexString(0xff & digested [i ]));
}
return sb. toString();
} catch (NoSuchAlgorithmException ex ) {
Logger. getLogger(CryptWithMD5. class. getName()). log(Level. SEVERE, null, ex );
}
return null;
}
} |
无法解密MD5,但可以比较输出,因为如果在此方法中放置相同的字符串,它将具有相同的加密输出。如果要解密,则需要使用sha。永远不会对用户密码使用deccription。为此,请始终使用md5。该异常是相当多余的。它不会抛出它。
- 我不知道为什么,但这个算法对我来说不是100%有效。有时结果不正确(我将结果与Tomcat上JDBC领域返回的MD5加密密码进行了比较)。这对我很有效:java2s.com/code/java/security/usemd5toencryptastring.htm
- @Adrianstamin你能解释一下0xff & digested[i]是做什么的吗?:)
- MD5不安全(容易解密),不应用于密码。
- @pache64消化的[i]&0xff确保只有消化的[i]的8个最低有效位可以为非零。0xFF以十进制为基数是255,以二进制为基数是00000000 00000000 11111,当您进行逐位运算时,&;)对于任何字节,它都将确保结果数字中只有最不重要的位可以为非零。示例:00000000 00000000 00000000 11111111(255)&00000000 00011111 00000000 01000000(8000)=>00000000 00000000 00000000 01000000
- @你说得对。MD5不安全。现在人们用的是咸MD5。存储密码的最好方法是让别人来做。比如facebook或者yahoo:)
- @Adrianstamin:即使是盐渍的MD5也是个坏主意。腌制是好的,但是用碎土豆泥腌制仍然是坏的。
Jasipt可以轻松简单地为你做这件事
- 正在做类似的事情…由于听起来您在某个时候确实需要解密密码,因此类似MD5的东西将无法工作。我认为这是最简单的解决方案。
- @Jasonstoltz如何与Jasipt一起添加盐?
编辑:这个答案很旧。现在不鼓励使用MD5,因为它很容易被破坏。
我想MD5对你来说一定足够好吧?您可以使用messagedigest来实现它。
MessageDigest.getInstance("MD5");。
这里还列出了其他算法。
这里有第三方版本,如果你真的想:快速MD5
- MD5只是单向哈希。你不能解密。
- + 1。@AVS31586,你根本不需要解密密码。相反,你用MD5加密,然后当你检查时,你总是检查两个MD5。有点让你绕过人们猜测你的加密算法的问题。
- 哎呀。错过了解密部分…虽然在存储密码时,这可能不会有太大的区别,但我把我的投票权交给了KAL。
- @:ziyao..谢谢您的建议,但在我们的应用程序中,我们需要解密该密码并将其显示给用户。你对加密和解密还有别的想法吗?
- 我知道这是一个老问题,但请不要使用MD5"加密"密码。MD5不安全,容易解密。
- 正如KalAlreaady所说,问题是加密和解密密码。MD5只是一种方法->散列。
- 散列是一种方法
- MD5从2009年就被打破了:cryptocrats.com/crypto/md5-the-hash-algorithm-is-now-break
您可以使用java.security.MessageDigest和SHA作为您的算法选择。
供参考,
请在此处尝试可用的示例
- 你的例子很好。但它不提供解密。你对解密有什么想法吗?
- 此处使用Base64Decoder示例
- org.apache.commons.codec.binary.base64需要哪个包;
- 我所建议的是一个非常简单的方法。但是Sun打包的文件显然不可用。String encoded = (new BASE64Encoder()).encode("text to be encoded".getBytes("UTF-8")); byte decodedRaw[] = (new BASE64Decoder()).decodeBuffer(encoded); String decoded = new String(decodedRaw,"UTF8");如果你想使用另一种方法,你可以引用它并创建一个自定义的加密/解密器。
- base64编码与加密和解密有什么关系?没有什么。
- base64编码不是加密,任何存储在base64中的东西都可以很容易地知道。里面没有保护。你们中有人在可能有我钱的银行或金融机构工作吗?亲爱的上帝,我希望不会!
我最近使用了SpringSecurity3.0(与WicketBTW结合使用),对此我非常满意。这里有一个非常全面的教程和文档。另外,请看一下本教程,它很好地解释了SpringSecurity2的散列/跳跃/解码设置。