Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C';Java中的s Crypt()类函数_Java_Crypt - Fatal编程技术网

C';Java中的s Crypt()类函数

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

我一直在读一些关于用Java加密密码的代码。这似乎有点计算密集

有没有类似于C或Ruby的快速加密字符串的方法

例如,在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
方法
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