2016-08-03 48 views
0

我使用this程序集作爲json提取程序,它的所有工作都正常。我輸入的json文件現在只是普通的json。我想要做的是讀取加密內容的文件。使用U-SQL讀取帶有加密內容的json文件

所以在提取器中,我想用我的C#方法解密一個字符串,但我不知道如何使這項工作,因爲我沒有得到任何字符串。這是提取方法。

public override IEnumerable<IRow> Extract(IUnstructuredReader input, IUpdatableRow output) 
    { 
     // Json.Net 
     using (var reader = new JsonTextReader(new StreamReader(input.BaseStream))) 
     { 
      // Parse Json 
      // TODO: Json.Net fails with empty input files 
      var root = JToken.ReadFrom(reader); 

      // Rows 
      // All objects are represented as rows 
      foreach (JObject o in SelectChildren(root, this.rowpath)) 
      { 
       // All fields are represented as columns 
       this.JObjectToRow(o, output); 

       yield return output.AsReadOnly(); 
      } 
     } 
    } 

這裏是我的解密方法

public static class Decryptor 
{ 
    private static readonly byte[] _key = Convert.FromBase64String("AAECAwQFBgcICQoLDA0ODw=="); 
    private static readonly byte[] _iv = Convert.FromBase64String("AAECAwQFBgcICQoLDA0ODw=="); 

    private static readonly ICryptoTransform _decryptor; 

    static Decryptor() 
    { 
     var myRijndael = new RijndaelManaged { Key = _key, IV = _iv, Padding = PaddingMode.PKCS7 }; 
     _decryptor = myRijndael.CreateDecryptor(myRijndael.Key, myRijndael.IV); 
    } 

    public static string Decrypt(string input) 
    { 
     // Create the streams used for decryption. 
     using (MemoryStream msDecrypt = new MemoryStream(Convert.FromBase64String(input))) 
     { 
      using (CryptoStream csDecrypt = new CryptoStream(msDecrypt, _decryptor, CryptoStreamMode.Read)) 
      { 
       using (StreamReader srDecrypt = new StreamReader(csDecrypt)) 
       { 
        return srDecrypt.ReadToEnd(); 
       } 
      } 
     } 
    } 

任何人都可以點我在正確的方向?謝謝!

回答

1

完整文件是加密的還是JSON文檔中的字段?在第一種情況下,您需要解密提取器中的baseStream。確保您將提取器屬性atomicFileProcessing設置爲true。

如果只JSON文件內的文本屬性是加密的,你有兩個選擇:

  1. 使用提取器領域(記住,它們被提取作爲鍵/值對中的SqlMap)然後將C#用戶定義函數應用於需要解密的值。

  2. JObjectToRow函數內部的某個地方會有一些生成Map條目的代碼。在那裏應用解密。

+0

感謝您的意見。全部內容不僅被解密,還被解密。是的,我試圖解密的基礎流,但迄今沒有成功。它無助於我無法真正調試它。至少我沒有找到如何。我可以將基本流轉換爲字符串(reader.ReadAsString())並解密,但不知道如何從那裏去 –

+0

我想我可以創建單元測試示例項目,所以現在試試看,所以我可以看到什麼繼續:) –

+1

您是否更新了VS工具?您現在可以對失敗的頂點進行本地調試。 –

1

通過將提取器更改爲以下我設法解密我的json文件的內容。

public override IEnumerable<IRow> Extract(IUnstructuredReader input, IUpdatableRow output) 
    { 
     // Json.Net 
     using (var reader = new StreamReader(input.BaseStream)) 
     { 
      // Parse Json 
      // TODO: Json.Net fails with empty input files 
      var text = reader.ReadToEnd(); 
      var decr = Encryption.Decryptor.Decrypt(text); 
      var root = JToken.Parse(decr); 

      // Rows 
      // All objects are represented as rows 
      foreach (JObject o in SelectChildren(root, this.rowpath)) 
      { 
       // All fields are represented as columns 
       this.JObjectToRow(o, output); 

       yield return output.AsReadOnly(); 
      } 
     } 
    } 

我將JsonTextReader更改爲StreamReader,以便我可以將該流作爲字符串讀取。在解密之後,我將它解析成一個JToken,所以剩下的代碼仍然像以前一樣工作。