0

将此程序集用作 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();
                }
            }
        }
    }

谁能指出我正确的方向?谢谢!

4

2 回答 2

1

完整文件是否加密或 JSON 文档中的字段?在第一种情况下,您需要在提取器中解密 baseStream。确保将提取器属性 atomicFileProcessing 设置为 true。

如果仅对 JSON 文档中的文本属性进行加密,则有两种选择:

  1. 使用提取器提取字段(请记住,它们被提取为 SqlMap 中的键/值对),然后对需要解密的值应用 C# 用户定义函数。

  2. 在 JObjectToRow 函数的更深处,会有一些代码生成 Map 条目。在那里应用解密。

于 2016-08-03T18:48:41.390 回答
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,因此其余代码仍然像以前一样工作。

于 2016-08-04T07:52:17.080 回答