我一直在阅读一些有关用 Java 加密密码的代码。这看起来计算强度更大一些。
有没有一种类似于 C 或 Ruby 的快速加密字符串的方法?
例如,在 Ruby 中:
'hello'.crypt('$6$salt') # => "$6$salt$ghQ6Rhatj/sug12c6v8Ao/bXUoyJ1O1SqdumufgGEO3b3NYPvm/dSWDKWfNm1VxFoFiy/cw9eRaY0xu4GDQSU/"
方法String#crypt()
来自C,在Linux中用于将散列密码存储在/etc/shadow
中:
$ sudo cat /etc/shadow | grep $USER
sourav:$6$Vx0wkV1M2PM43WOE$b2pYu.funKjk/snGSqiMTgh1e9dGQYDEKrjfuc2T/tP5qs7lXU56MjFvWd35rgzmYBXK33DrjQqnxTcPtcMXi/:18013:0:99999:7:::
这是一个小程序...
知道我的系统密码是 55,在 Ruby 中:
pass = IO.readlines('/etc/shadow').find { |x| x.start_with?(ENV['USER']) }
=> "sourav:$6$Vx0wkV1M2PM43WOE$b2pYu.funKjk/snGSqiMTgh1e9dGQYDEKrjfuc2T/tP5qs7lXU56MjFvWd35rgzmYBXK33DrjQqnxTcPtcMXi/:18013:0:99999:7:::\n"
h = ?$ + pass.split(?$)[1..2].join(?$)
=> "$6$Vx0wkV1M2PM43WOE"
s = pass.split(?$)[-1].split(?:)[0]
=> "b2pYu.funKjk/snGSqiMTgh1e9dGQYDEKrjfuc2T/tP5qs7lXU56MjFvWd35rgzmYBXK33DrjQqnxTcPtcMXi/"
hs = h + ?$ + s
=> "$6$Vx0wkV1M2PM43WOE$b2pYu.funKjk/snGSqiMTgh1e9dGQYDEKrjfuc2T/tP5qs7lXU56MjFvWd35rgzmYBXK33DrjQqnxTcPtcMXi/"
'55'.crypt(h) == hs
=> true
这样系统就可以确认我的密码是55并让我登录。
Java中有没有类似的方法可以加密字符串?如果给出了帐户密码,我可以类似地运行 'string.crypt("$6$salt")' 并解密 /etc/shadow
的帐户密码吗?
最佳答案
and decrypt /etc/shadow's account password if the account password is given
crypt() 函数不是加密,该函数创建加盐密码哈希。
哈希是一种单向函数,其主要功能之一是任何人都无法根据(加密)哈希值恢复密码。
So the system can confirm my password is 55 and let me log in.
这是可能的。实际上,您可以计算一个新的加盐哈希(使用相同的盐)并与存储的值进行比较。
Is there a similar method in Java that can encrypt a string?
import org.apache.commons.codec.digest.Crypt;
...
String hash = Crypt.crypt("password".getBytes());
System.out.println("salted hash: "+hash);
// salt is $X$some_bytes
String salt = hash.substring(0, hash.indexOf("$", 3));
System.out.println("salt: "+salt);
// validation:
String testString = Crypt.crypt("password", salt);
if(testString.equals(hash)) {
System.out.println("Password match");
} else {
System.out.println("Invalid password");
}
关于java - C 的 Crypt() 类似 Java 中的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58976180/