2017-09-06 15 views
5

मेरे पास Xamarin.iOS ऐप है जो डेटा को कैश करने के लिए Akavache का उपयोग कर रहा है और डेटा के लिए सर्वर को अनावश्यक अनुरोधों पर संख्या को कम करता है। सब कुछ BlobCache.LocalMachine का उपयोग करके अपेक्षित काम कर रहा है, इसे प्यार करें।Xamarin.iOS/Akavache - कस्टम एन्क्रिप्शनप्रोवाइडर के साथ एन्क्रिप्टेड कैश

अब मैं यह सुनिश्चित करना चाहता हूं कि शेष डेटा एन्क्रिप्टेड में है। ऑनलाइन शोध करने और दस्तावेज़ीकरण पढ़ने से मैंने देखा कि डिफ़ॉल्ट कार्यान्वयन वास्तव में आईओएस पर कैश को एन्क्रिप्ट नहीं करता है और मुझे वास्तव में IEncryptionProvider का कस्टम कार्यान्वयन प्रदान करने की आवश्यकता है। http://kent-boogaart.com/blog/password-protected-encryption-provider-for-akavache

इस धागे से

जोड़ा गया इनपुट:

मैं इस लेख का पालन https://github.com/akavache/Akavache/issues/190

और यह कार्यान्वयन के साथ समाप्त हो गया:

public interface IPasswordProtectedEncryptionProvider : IEncryptionProvider 
    { 
     void SetPassword(string password); 
    } 

    public sealed class MyEncryptionProvider : IPasswordProtectedEncryptionProvider 
    { 
     static readonly byte[] salt = Encoding.ASCII.GetBytes("dVBZMQWyFRcJOIas"); 
     readonly IScheduler scheduler; 
     readonly SymmetricAlgorithm symmetricAlgorithm; 
     ICryptoTransform decryptTransform; 
     ICryptoTransform encryptTransform; 

     public MyEncryptionProvider() 
     { 
      scheduler = BlobCache.TaskpoolScheduler ?? throw new ArgumentNullException(nameof(scheduler), "Scheduler instance is null"); 
      symmetricAlgorithm = new RijndaelManaged(); 
      var securePassword = "kadhaskdhsakhaskjdhaskjdhaskdjashdkjahkfghkjhew"; 
      SetPassword(securePassword); 
     } 

     public void SetPassword(string password) 
     { 
      if(password == null) 
       throw new ArgumentNullException(nameof(password), "password can't be null"); 

      var derived = new Rfc2898DeriveBytes(password, salt); 
      var bytesForKey = symmetricAlgorithm.KeySize/8; 
      var bytesForIV = symmetricAlgorithm.BlockSize/8; 
      symmetricAlgorithm.Key = derived.GetBytes(bytesForKey); 
      symmetricAlgorithm.IV = derived.GetBytes(bytesForIV); 
      decryptTransform = symmetricAlgorithm.CreateDecryptor(symmetricAlgorithm.Key, symmetricAlgorithm.IV); 
      encryptTransform = symmetricAlgorithm.CreateEncryptor(symmetricAlgorithm.Key, symmetricAlgorithm.IV); 
     } 

     public IObservable<byte[]> DecryptBlock(byte[] block) 
     { 
      if (block == null) 
      { 
       throw new ArgumentNullException(nameof(block), "block can't be null"); 
      } 

      if (decryptTransform == null) 
      { 
       return Observable.Throw<byte[]>(new InvalidOperationException("You must call SetPassword first.")); 
      } 

      return Observable.Start(() => InMemoryTransform(block, decryptTransform), scheduler); 
     } 

     public IObservable<byte[]> EncryptBlock(byte[] block) 
     { 
      if (block == null) 
      { 
       throw new ArgumentNullException(nameof(block), "block can't be null"); 
      } 

      if (encryptTransform == null) 
      { 
       return Observable.Throw<byte[]>(new InvalidOperationException("You must call SetPassword first.")); 
      } 

      return Observable.Start(() => InMemoryTransform(block, encryptTransform), scheduler); 
     } 

     static byte[] InMemoryTransform(byte[] bytesToTransform, ICryptoTransform transform) 
     { 
      using (var memoryStream = new MemoryStream()) 
      { 
       using (var cryptoStream = new CryptoStream(memoryStream, transform, CryptoStreamMode.Write)) 
       { 
        cryptoStream.Write(bytesToTransform, 0, bytesToTransform.Length); 
       } 

       return memoryStream.ToArray(); 
      } 
     } 
    } 

मैं इस तरह इस कार्यान्वयन रजिस्टर: Locator.CurrentMutable.RegisterConstant(new MyEncryptionProvider(), typeof(IEncryptionProvider)); कॉल करने से पहले BlobCache.Secure

और मैं EncryptBlock और DecryptBlock देखें जब मैं उस सुरक्षित कैश पर .GetOrFetchObject का उपयोग करता हूं। अब तक सब ठीक है।

{Newtonsoft.Json.JsonReaderException: Read past end of current container context. Path ''. 
    at Newtonsoft.Json.Bson.BsonReader.ReadNormal() [0x0013c] in <c19705166c7c4a608e182e859c4de6d2>:0 
    at Newtonsoft.Json.Bson.BsonReader.Read() [0x00033] in <c19705166c7c4a608e182e859c4de6d2>:0 
    at Newtonsoft.Json.JsonReader.ReadAndAssert() [0x00000] in <c19705166c7c4a608e182e859c4de6d2>:0 
    at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateObject (Newtonsoft.Json.JsonReader reader, System.Type objectType, Newtonsoft.Json.Serialization.JsonContract contract, Newtonsoft.Json.Serialization.JsonProperty member, Newtonsoft.Json.Serialization.JsonContainerContract containerContract, Newtonsoft.Json.Serialization.JsonProperty containerMember, System.Object existingValue) [0x000b6] in <c19705166c7c4a608e182e859c4de6d2>:0 
    at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.CreateValueInternal (Newtonsoft.Json.JsonReader reader, System.Type objectType, Newtonsoft.Json.Serialization.JsonContract contract, Newtonsoft.Json.Serialization.JsonProperty member, Newtonsoft.Json.Serialization.JsonContainerContract containerContract, Newtonsoft.Json.Serialization.JsonProperty containerMember, System.Object existingValue) [0x0006d] in <c19705166c7c4a608e182e859c4de6d2>:0 
    at Newtonsoft.Json.Serialization.JsonSerializerInternalReader.Deserialize (Newtonsoft.Json.JsonReader reader, System.Type objectType, System.Boolean checkAdditionalContent) [0x000db] in <c19705166c7c4a608e182e859c4de6d2>:0 
    at Newtonsoft.Json.JsonSerializer.DeserializeInternal (Newtonsoft.Json.JsonReader reader, System.Type objectType) [0x00053] in <c19705166c7c4a608e182e859c4de6d2>:0 
    at Newtonsoft.Json.JsonSerializer.Deserialize (Newtonsoft.Json.JsonReader reader, System.Type objectType) [0x00000] in <c19705166c7c4a608e182e859c4de6d2>:0 
    at Newtonsoft.Json.JsonSerializer.Deserialize[T] (Newtonsoft.Json.JsonReader reader) [0x00000] in <c19705166c7c4a608e182e859c4de6d2>:0 
    at Akavache.Sqlite3.SQLitePersistentBlobCache.DeserializeObject[T] (System.Byte[] data) [0x00074] in <67aced6c5c1a4c15b03e120d7300429d>:0 
--- End of stack trace from previous location where exception was thrown --- 
    at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() [0x0000c] in /Library/Frameworks/Xamarin.iOS.framework/Versions/10.12.0.20/src/mono/mcs/class/referencesource/mscorlib/system/runtime/exceptionservices/exceptionservicescommon.cs:151 
    at System.Reactive.PlatformServices.ExceptionServicesImpl.Rethrow (System.Exception exception) [0x00006] in <427ee2007f4d40bb9d3f1fcd73e9b750>:0 
    at System.Reactive.ExceptionHelpers.ThrowIfNotNull (System.Exception exception) [0x0000d] in <ab76b1b1678341d69f8fc2c1f68d0bf5>:0 
    at System.Reactive.Subjects.AsyncSubject`1[T].GetResult() [0x00039] 

जब एक ही वस्तु BlobCache.LocalMachine एक ही डेटा संरचना का उपयोग कैश किया गया है सफलतापूर्वक इस तरह संग्रहीत किया जाता है:

समस्या मैं में चलाने

यह विफल रहता है कि जब Newtonsoft से इस त्रुटि के साथ deserialize की कोशिश कर रहा है

[ 
    { 
    "Name": "John Smith", 
    "Date": "2017-04-03T20:00:00-04:00", 
    "Number1": -8820768.6192349959, 
    "Number2": -25540081.8275, 
    "Number3": -0.0045255076670528034, 
    "Number4": 0.0457761358483606, 
    "RelatedObjects": [], 
    "LastUpdateTime": "2017-04-04T17:36:06.247-04:00" 
    } 
] 

मुझे यहां क्या याद आ रही है? बहुत निराश, वास्तव में उम्मीद है कि कोई ऐसा कुछ देखता है जो मैं नहीं हूं। आपकी सहायता के लिए धन्यवाद.

+1

कोई व्यक्ति यहां आने पर नमूना के साथ अन्य मुद्दे का संदर्भ देता है पहले https://stackoverflow.com/questions/46104014/xamarin-ios-akavache-working-example –

+0

इस पोस्ट में उदाहरण की सहायता से: https://stackoverflow.com/questions/46104014/xamarin-ios-akavache-wo rking-example मैं इस समस्या को हल करने में सक्षम था और नमूना समाधान में एक कामकाजी उदाहरण दिखाया गया है: https://github.com/dmitrysamuylov/xamarin-ios-akavache-secure-example आशा है कि यह किसी की सहायता करे –

उत्तर

2
इस पोस्ट में उदाहरण की मदद से

: Xamarin.iOS/Akavache Working Example

मैं इस समस्या का समाधान प्राप्त करने में सक्षम था और एक काम कर उदाहरण नमूना यहाँ समाधान में दिखाया गया है: https://github.com/dmitrysamuylov/xamarin-ios-akavache-secure-example

आशा है कि यह मदद करता है में किसी को भविष्य

संबंधित मुद्दे