java - C 的 Crypt() 类似 Java 中的函数

标签 java crypt

我一直在阅读一些有关用 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/

相关文章:

java - 在新文本加载时重置 TextView 位置(可滚动)

php - Crypt 和 Salt 如何比 MD5 更安全地抵御暴力攻击?

c - 如何使用 crypt() 函数获取十六进制哈希值?

php - MYSQL - 使用 CRYPT 进行散列时出现特殊字符问题

java - 警惕 volatile /同步性能损失

java - Java 中的 NoClassDefFoundError : com/google/common/base/Function

java - Jsoup 调试 POST 请求

java - Eclipse, "Exception in thread "线程 - 2"java.util.ConcurrentModificationException"

基于C的DES加密密码的破解功能,不起作用?

laravel crypt::encrypt 和 crypt::encryptString 之间的区别