2017-11-26 26 views
0

私は以下のC#システムに接続しているjavaでパスワードを暗号化しようとしています。この暗号化はRfc2898DeriveBytesを使用して行われます。以下Rfc2898DeriveBytes for this .Net codeパスワード暗号化

class StringCipher 
{ 
    private const int Keysize = 256; 
    private const int DerivationIterations = 1000; 

    public static string Encrypt(string plainText, string passPhrase) 
    { 

     var saltStringBytes = Generate256BitsOfRandomEntropy(); 
     var ivStringBytes = Generate256BitsOfRandomEntropy(); 
     var plainTextBytes = Encoding.UTF8.GetBytes(plainText); 
     using (var password = new Rfc2898DeriveBytes(passPhrase, saltStringBytes, DerivationIterations)) 
     { 
      var keyBytes = password.GetBytes(Keysize/8); 
      using (var symmetricKey = new RijndaelManaged()) 
      { 
       symmetricKey.BlockSize = 256; 
       symmetricKey.Mode = CipherMode.CBC; 
       symmetricKey.Padding = PaddingMode.PKCS7; 
       using (var encryptor = symmetricKey.CreateEncryptor(keyBytes, ivStringBytes)) 
       { 
        using (var memoryStream = new MemoryStream()) 
        { 
         using (var cryptoStream = new CryptoStream(memoryStream, encryptor, CryptoStreamMode.Write)) 
         { 
          cryptoStream.Write(plainTextBytes, 0, plainTextBytes.Length); 
          cryptoStream.FlushFinalBlock(); 
          var cipherTextBytes = saltStringBytes; 
          cipherTextBytes = cipherTextBytes.Concat(ivStringBytes).ToArray(); 
          cipherTextBytes = cipherTextBytes.Concat(memoryStream.ToArray()).ToArray(); 
          memoryStream.Close(); 
          cryptoStream.Close(); 
          return Convert.ToBase64String(cipherTextBytes); 
         } 
        } 
       } 
      } 
     } 
    } 

    private static byte[] Generate256BitsOfRandomEntropy() 
    { 
     var randomBytes = new byte[32]; 
     using (var rngCsp = new RNGCryptoServiceProvider()) 
     { 
      rngCsp.GetBytes(randomBytes); 
     } 
     return randomBytes; 
    } 
} 

.net Source code here

.NET暗号化がRfc2898DeriveBytesを使用して行われ、私はJavaで試してみましたが、それは私のために働いていないもので、ここで私が使用しているのSecureRandom SR =新しいのSecureRandom();それと同等のものですが、何らかの理由で私はパスワードを暗号化できません。助けてください

public class PasswordEncryption { 
    private final static int DerivationIterations = 1000; 
    private final int Keysize = 256; 

    private static byte[] getSalt() throws NoSuchAlgorithmException { 
     SecureRandom sr = new SecureRandom(); 
     byte[] salt = new byte[32]; 
     sr.nextBytes(salt); 
     return salt; 
    } 

    public static String Encrypt(String plainText, String passPhrase) 
      { 
     Security.addProvider(new org.bouncycastle.jce.provider.BouncyCastleProvider()); 
     byte[] saltStringBytes = getSalt(); 
     byte[] IvStringBytes=getSalt(); 
     byte[] pwd = plainText.getBytes("UTF-8"); 
     char[] chars = passPhrase.toCharArray(); 
     SecretKeyFactory factory = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA1"); 
     KeySpec pbeKeySpec = new PBEKeySpec(chars, saltStringBytes, DerivationIterations, 256); 
     SecretKey secretKey = factory.generateSecret(pbeKeySpec); 
     System.out.println(secretKey.toString()); 
     SecretKey secret = new SecretKeySpec(secretKey.getEncoded(), "AES"); 
     Cipher cipher = Cipher.getInstance("AES/CBC/PKCS7Padding","BC"); 
     cipher.init(Cipher.ENCRYPT_MODE, secret); 
     byte[] result = cipher.doFinal(pwd); 
     ByteArrayOutputStream outputStream = new ByteArrayOutputStream(); 
     outputStream.write(saltStringBytes); 
     outputStream.write(IvStringBytes); 
     outputStream.write(result); 

     byte end[] = outputStream.toByteArray(); 

     String base64Encoded = Base64.getEncoder().encodeToString(end); 
     System.out.println(base64Encoded); 

     return base64Encoded; 

    } 

    public static void main(String[] args) { 
     Encrypt("passwordhere", "ABC"); 
    } 

} 

答えて

0

パスワードを暗号化しないでください.Rfc2898DeriveBytesを使用してパスワードベリファイアを作成してください。パスワードは回復可能であってはならない、つまりセキュリティ上の脆弱性です。攻撃者が管理者権限を取得し、暗号化されたパスワードを取得すると、暗号化キーも取得され、残りのユーザーの資格情報とともにパスワードが取得されます。

Rfc2898DeriveBytesを使用してパスワードベリファイアを作成し、派生パスワードと一緒にソルトとラウンド数を保存します。

パスワードを確認するときに、保存されたsaltとrounds countでRfc2898DeriveBytesを通じて提供されたパスワードを実行し、結果を保存された派生と比較します。

+0

.netシステムを編集することはできません。私たちはjavaにアクセスして、同様の暗号化方法を作成しています。お知らせ下さい。 –

+0

質問する必要がある質問は、 "あなたのセキュリティはどれくらい重要ですか?"答えが「非常に重要」の場合は、パスワードを暗号化せず、現在のベストプラクティスを使用してください。 OTOHと答えた場合は、「気にしないでください」とパスワードを暗号化してください。それは簡単な決定です。 – zaph