私は以下の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暗号化が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");
}
}
.netシステムを編集することはできません。私たちはjavaにアクセスして、同様の暗号化方法を作成しています。お知らせ下さい。 –
質問する必要がある質問は、 "あなたのセキュリティはどれくらい重要ですか?"答えが「非常に重要」の場合は、パスワードを暗号化せず、現在のベストプラクティスを使用してください。 OTOHと答えた場合は、「気にしないでください」とパスワードを暗号化してください。それは簡単な決定です。 – zaph