[英]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屬性,則有兩個選擇:
使用提取器提取字段(請記住,它們在SqlMap中作為鍵/值對提取),然后對需要解密的值應用C#用戶定義的函數。
在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.