在C#中使用MachineKey编码进行Umbraco解密

时间:2018-12-18 08:39:01

标签: c# encryption umbraco machinekey

我想首先在Umbraco的内容编辑器中加密某些节点。下面的代码是我用于加密的代码。我为此使用MachineKey.Protect。

        try
        {
            MailMessage message1 = new MailMessage();
            MailMessage message2 = new MailMessage();
            SmtpClient client = new SmtpClient();
            string AfsenderEmail = model.Email;
            string AfsenderNavn = model.Name;

            string toAddress = Umbraco.Content(rootNode.Id).mailDerSendesTil;
            message1.From = new MailAddress(toAddress);
            message2.From = new MailAddress(toAddress);

            message1.Subject = $"{Umbraco.Content(rootNode.Id).overskriftPaaDenMailViFaar}";
            message1.Subject = message1.Subject.Replace("AfsenderEmail", AfsenderEmail);
            message1.Subject = message1.Subject.Replace("AfsenderNavn", AfsenderNavn);
            message1.Body = $"{Umbraco.Content(rootNode.Id).beskedViFaarNaarBeskedenSendes}";
            message1.Body = message1.Body.Replace("AfsenderEmail", AfsenderEmail);
            message1.Body = message1.Body.Replace("AfsenderNavn", AfsenderNavn);


            message1.To.Add(new MailAddress(toAddress));


            client.Send(message1);

            message2.Subject = $"{Umbraco.Content(rootNode.Id).overskriftPaaMeddelelsenAfsenderenFaar}";
            message2.Subject = message2.Subject.Replace("AfsenderEmail", AfsenderEmail);
            message2.Subject = message2.Subject.Replace("AfsenderNavn", AfsenderNavn);
            message2.Body = $"{Umbraco.Content(rootNode.Id).beskedAfsenderenFaarNaarBeskedenSendes}";
            message2.Body = message2.Body.Replace("AfsenderEmail", AfsenderEmail);
            message2.Body = message2.Body.Replace("AfsenderNavn", AfsenderNavn);

            message2.To.Add(new MailAddress(AfsenderEmail));

            client.Send(message2);

            var beskederNode = Umbraco.TypedContentAtRoot().FirstOrDefault(x => x.ContentType.Alias.Equals("Besked"));

            var encryptName = MachineKey.Protect(Encoding.ASCII.GetBytes(model.Name));
            var encryptEmail = MachineKey.Protect(Encoding.ASCII.GetBytes(model.Email));
            var encryptMessage = MachineKey.Protect(Encoding.ASCII.GetBytes(model.Message));

            string nameEncrypted = Encoding.ASCII.GetString(encryptName);
            string emailEncrypted = Encoding.ASCII.GetString(encryptEmail);
            string messageEncrypted = Encoding.ASCII.GetString(encryptMessage);

            var newContent = contentService.CreateContent(nameEncrypted, beskederNode.Id, "mails");

            newContent.SetValue("fra", nameEncrypted);
            newContent.SetValue("eMail", emailEncrypted);
            newContent.SetValue("besked", messageEncrypted);

            var result = contentService.SaveAndPublishWithStatus(newContent);
            return new HttpStatusCodeResult(HttpStatusCode.OK);
        }
        catch (System.Exception ex)
        {
            Log.Error("Contact Form Error", ex);
            return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
        }

    }

这是我尝试再次解密代码的地方。当我调用MachineKey.Unprotect(nameDecrypted)时,它引发了异常(System.Security.Cryptography.CryptographicException:“在加密操作期间发生错误。”),我找不到错误。我认为这可能与我的编码和解码有关?

    private void EditorModelEventManager_SendingContentModel(System.Web.Http.Filters.HttpActionExecutedContext sender, EditorModelEventArgs<Umbraco.Web.Models.ContentEditing.ContentItemDisplay> e)
    {
        var node = e.Model.Properties.ToList();
        if (e.Model.IsChildOfListView && e.Model.ContentTypeAlias == "mails")
        {
            string nameDecrypt = node.Where(x => x.Alias.ToLower() == "fra").Select(x => x.Value).First().ToString();
            Byte[] nameDecrypted = Encoding.ASCII.GetBytes(nameDecrypt);
            var name = e.Model.Properties.FirstOrDefault(x => x.Alias.ToLower() == "fra");
            Byte[] decryptName = MachineKey.Unprotect(nameDecrypted);
            string nameReady = Encoding.ASCII.GetString(decryptName);
            name.Value = $"{nameReady}";
        }
    }
}

}

1 个答案:

答案 0 :(得分:0)

我找到了解决方案。我没有使用Encoding.ASCII.GetString(),而是使用Convert.FromBase64String()。