C';Java中的s Crypt()类函数
我一直在读一些关于用Java加密密码的代码。这似乎有点计算密集 有没有类似于C或Ruby的快速加密字符串的方法 例如,在Ruby中:C';Java中的s Crypt()类函数,java,crypt,Java,Crypt,我一直在读一些关于用Java加密密码的代码。这似乎有点计算密集 有没有类似于C或Ruby的快速加密字符串的方法 例如,在Ruby中: 'hello'.crypt('$6$salt') # => "$6$salt$ghQ6Rhatj/sug12c6v8Ao/bXUoyJ1O1SqdumufgGEO3b3NYPvm/dSWDKWfNm1VxFoFiy/cw9eRaY0xu4GDQSU/" pass = IO.readlines('/etc/shadow').find { |x| x.star
'hello'.crypt('$6$salt') # => "$6$salt$ghQ6Rhatj/sug12c6v8Ao/bXUoyJ1O1SqdumufgGEO3b3NYPvm/dSWDKWfNm1VxFoFiy/cw9eRaY0xu4GDQSU/"
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
方法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中:
'hello'.crypt('$6$salt') # => "$6$salt$ghQ6Rhatj/sug12c6v8Ao/bXUoyJ1O1SqdumufgGEO3b3NYPvm/dSWDKWfNm1VxFoFiy/cw9eRaY0xu4GDQSU/"
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
”的帐户密码?Java从1.4开始就包含一个名为的包,它允许您使用密码加密和解密数据
有此软件包的教程。下面是一个小Java代码段,它首先加密数据,然后解密数据:
public class CipherSample {
public static void main(String args[]) throws Exception{
//Creating a Signature object
Signature sign = Signature.getInstance("SHA256withRSA");
//Creating KeyPair generator object
KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA");
//Initializing the key pair generator
keyPairGen.initialize(2048);
//Generating the pair of keys
KeyPair pair = keyPairGen.generateKeyPair();
//Creating a Cipher object
Cipher cipher = Cipher.getInstance("RSA/ECB/PKCS1Padding");
//Initializing a Cipher object
cipher.init(Cipher.ENCRYPT_MODE, pair.getPublic());
//Adding data to the cipher
byte[] input = "Welcome to Tutorialspoint".getBytes();
cipher.update(input);
//encrypting the data
byte[] cipherText = cipher.doFinal();
System.out.println(new String(cipherText, "UTF8"));
//Initializing the same cipher for decryption
cipher.init(Cipher.DECRYPT_MODE, pair.getPrivate());
//Decrypting the text
byte[] decipheredText = cipher.doFinal(cipherText);
System.out.println(new String(decipheredText));
}
}
虽然没有那么简单,但仍然很简单。crypt C库函数使用DES作为其加密。如果希望在Java中获得完全相同的结果,则必须使用相同的算法 简言之:
KeyGenerator keygenerator = KeyGenerator.getInstance("DES");
SecretKey desKey = keygenerator.generateKey();
Cipher cipher = Cipher.getInstance("DES/ECB/PKCS5Padding");
cipher.init(Cipher.ENCRYPT_MODE, desKey);
byte[] encrypted = desCipher.doFinal(clearText.getBytes());
您可以在此处找到教程:
并解密/etc/shadow的帐户密码(如果给定了帐户密码)
该函数不是加密函数,而是创建一个附加密码散列
散列是一个单向函数,它的主要特性之一是任何人都不能从(加密的)散列值恢复密码
所以系统可以确认我的密码是55,让我登录
这是可能的。实际上,您可以计算一个新的salt散列(使用相同的salt)并与存储的值进行比较
Java中是否有类似的方法可以加密字符串注:
byte[]b=s.getBytes(“UTF-8”);s=新字符串(b,“UTF-8”)
或StandardCharsets.UTF_8
i.o.`UTF-8`.IDK为什么,但它说错误:找不到符号
我也无法导入org.apache.commons.codec.digest.Crypt
,它不存在:(@S.Goswami您在构建路径中包含commons编解码器jar了吗?好的,我已经包含了它,并导入了import org.apache.commons.codec.digest.Crypt
,这似乎很好。但是在使用Crypt()时出现了找不到符号的错误)
根据给定链接中的示例…我不确定这是否与函数所做的相同七询问者混合了散列和密文,这个答案是错误的,并且没有解决问题(甚至有误导性)我不认为这是Crypt().在提出问题之前,我在TutorialPoint上阅读了这篇文章,其中有一个关于Java加密的stackoverflow问题,但它们是其他算法…不是真的,第一个数字$6$
定义了哈希算法,模式6是sha-256