簡體   English   中英

使用U-SQL讀取具有加密內容的json文件

[英]Reading in json file with encrypted content with U-SQL

將此程序集用作json提取程序,並且一切正常。 我輸入的json文件現在只是普通的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();
                }
            }
        }
    }

誰能指出我正確的方向? 謝謝!

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

如果僅加密JSON文檔中的text屬性,則有兩個選擇:

  1. 使用提取器提取字段(請記住,它們在SqlMap中作為鍵/值對提取),然后對需要解密的值應用C#用戶定義的函數。

  2. 在JObjectToRow函數內部更深的地方,將有一些代碼生成Map條目。 在此處應用解密。

通過將提取器更改為以下內容,我設法解密了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,因此其余代碼仍像以前一樣工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM