Правильный способ использования шифрования в общем проекте Xamarin
В настоящее время я разрабатываю проект Xamarin Forms, и мне нужно использовать несколько методов шифрования, которые обычно доступны через пространство имен System.Security.Cryptography, а именно RSACryptoServiceProvider. До сих пор я использовал пакет PCLCrypto nuget для использования других методов, таких как хеширование MD5, но я не понял, как конкретно использовать RSA. Мне также было интересно, будет ли лучше реализовать эти методы непосредственно в каждом родном проекте, а затем использовать их в общем, а не в nuget.
Есть мысли по этому поводу? Если бы кто-то мог указать мне на какую-то документацию для PCLCrypto, эквивалентную тому, что мне нужно, это тоже было бы хорошо, мне просто нужны некоторые сведения об этой проблеме и некоторые разъяснения, поскольку я прочитал некоторые другие вопросы, но на самом деле консенсуса нет.
2 ответа
Поскольку пакет Nuget для криптографии не совместим с PCL, вы можете использовать Xamarin.Forms DependencyService. Вы можете реализовать эти методы Crypto изначально и просто вызвать фактические реализации через DependencyService.
Создайте интерфейс в вашем PCL (например, ICrypto).
Создайте в этом интерфейсе метод, который, например, проверяет пароль (например, bool PasswordValid).
Добавьте пакет Nuget для System.Security.Cryptography в ваш собственный проект.
Создайте класс в своем родном коде, который будет реализовывать этот интерфейс (например, Crypto_Android) и иметь реализацию для метода (например, bool PasswordValid)
Вызовите этот код с вашего PCL через DependencyService. Синтаксис будет примерно таким:
bool valid = DependencyService.Get
ПРИМЕЧАНИЕ: код действительной криптографии вы можете проверить по ссылке PCLCrypto Github, предоставленной Tifa выше.
Простой пример DependencyService можно найти здесь.
Я не знаю, может ли AES быть интересным для вас, но, возможно, вы можете взглянуть на этот образец.
byte[] keyMaterial;
byte[] data;
var provider = WinRTCrypto.SymmetricKeyAlgorithmProvider.OpenAlgorithm(SymmetricAlgorithm.AesCbcPkcs7);
var key = provider.CreateSymmetricKey(keyMaterial);
// The IV may be null, but supplying a random IV increases security.
// The IV is not a secret like the key is.
// You can transmit the IV (w/o encryption) alongside the ciphertext.
var iv = WinRTCrypto.CryptographicBuffer.GenerateRandom(provider.BlockLength);
byte[] cipherText = WinRTCrypto.CryptographicEngine.Encrypt(key, data, iv);
// When decrypting, use the same IV that was passed to encrypt.
byte[] plainText = WinRTCrypto.CryptographicEngine.Decrypt(key, cipherText, iv);
Может быть, эта ссылка поможет вам с криптографией в проекте Xamarin.Forms ( Использование криптографии в переносимых формах Xamarin (Windows Phone, Android и IOS))