我知道如何为单个字符串生成MD5哈希,
但是如果我想这样生成它会怎么样:
String hash1 = GenHash(用户名:realm:密码);
修改用户名和域名时,从包含许多单词的文本文件中读取密码,我希望每个单词都转换为md5哈希...
我该怎么做?
答案 0 :(得分:1)
Neil之所以如此坚持不使用MD5(顺便说一句,他是对的)是因为MD5容易受到攻击。这意味着如果攻击者发现哈希输出,则可以恢复密码。由于散列密码通常是这样做的,所以如果找到散列就不会显示原像(即密码),你强烈(非常强烈地)建议不要使用MD5。 (事实上,如果你从事商业活动并且使用MD5作为密码,那么请务必使用疏忽诉讼。[不合法建议])Neil建议使用一些好的哈希算法。 (MD5易受攻击的细节远远超出了这个问题的范围。)
好。你的问题是如何将多个东西混合在一起。
为了将多个事物一起散列,你通常只是连接它们或者只是按顺序散列它们而不调用“digest()”。 (顺便说一下,顺序很重要。)在你的情况下,由于你在散列函数上有一个包装器,你只需要在对它们进行散列之前将这些字符串连接在一起。
String username = "myName";
String realm = "Narnia";
String password = "secret";
String hash = GenHash(username + realm + password);
在其他所有人的情况下,他们可能正在使用标准的Java MessageDigest,因此在将字符串转换为字节数组后,他们会多次调用digest。 (请注意,在将String转换为字节数组时,您将要指定编码,以确保它始终以相同的方式完成,否则您的哈希函数可能会在不同的计算机上返回不同的结果。)
byte[] usernameBytes; //Set equal to perhaps UTF32 encoding of the string
byte[] realmBytes; //Set equal to perhaps UTF32 encoding of the string
byte[] passwordBytes; //Set equal to perhaps UTF32 encoding of the string
MessageDigest md = MessageDigest.getInstance("MD5");
md.update(usernameBytes); //Updates digest with these bytes
md.update(realmBytes); //Updates digest with these bytes
md.update(passwordBytes); //Updates digest with these bytes
byte[] hashResult = md.digest(); //Outputs result
//Insert code to convert the byte array to an outputtable form (or perhaps you're writing to a binary file)
但请记住:使用Strings会出现安全漏洞!
字符串永远不应该用于密码,因为不能保证字符串值被删除(因为它们驻留在堆上,因此垃圾收集器可能会被它“删除”,并且被“删除”我的意思是解除分配,而不是删除)。获取内存转储访问权限的攻击者可以读取密码。 (不可否认,如果攻击者获得内存转储,您还有其他问题,但不要让它变得更糟。)
首选char []用于所有密码或其他非常敏感的文本值。因此,您将创建一个大小的新char数组(username.length()+ realm.length()+ password.length()),然后遍历每个字符串并将每个字符添加到新数组中...然后哈希...然后你将擦除你不再使用的所有敏感文本值(通过迭代每个数组并将每个元素设置为等于(char)0)。
同样,您无法手动删除或擦除字符串,但您可以手动擦除char或char []。
Why is char[] preferred over String for passwords?
当你在它时,查找密码或哈希腌制。它可能对你正在做的事情有用。