{"id":416,"date":"2011-11-01T10:34:45","date_gmt":"2011-11-01T16:34:45","guid":{"rendered":"https:\/\/chrisedwards.dreamhosters.com\/blog\/?p=416"},"modified":"2011-10-31T23:24:35","modified_gmt":"2011-11-01T05:24:35","slug":"you-are-protecting-your-passwords-in-your-config-files-arent-you","status":"publish","type":"post","link":"http:\/\/architester.com\/blog\/2011\/11\/01\/you-are-protecting-your-passwords-in-your-config-files-arent-you\/","title":{"rendered":"You ARE protecting your passwords in your config files AREN&#8217;T YOU?"},"content":{"rendered":"<p>When we are writing software for our clients, we have a <a title=\"Definition of fiduciary\" href=\"http:\/\/www.learnersdictionary.com\/search\/fiduciary\" target=\"_blank\">fiduciary<\/a> responsibility to ensure the security of their site.<\/p>\n<p>One way to increase security is to ensure that passwords and other sensitive information are not laying around in our config files unsecured (in plain text). All too many times I have seen something like the following in a config file:<\/p>\n<p>Code Sample:<\/p>\n<pre style=\"border: 2px solid #777; padding: 5px; font-size: 10pt; font-family: Tahoma; color: #f1f2f3; background: #232323;\">&lt;?<span \r\n            style=\"color:#93c763;\">xml<\/span>&nbsp;<span style=\"color:#678cb1;\">version<\/span>=<span \r\n            style=\"color:#cc7833;\">&quot;<\/span><span style=\"color:#ec7600;\">1.0<\/span><span \r\n            style=\"color:#cc7833;\">&quot;<\/span>&nbsp;<span style=\"color:#678cb1;\">encoding<\/span>=<span \r\n            style=\"color:#cc7833;\">&quot;<\/span><span style=\"color:#ec7600;\">utf-8<\/span><span \r\n            style=\"color:#cc7833;\">&quot;<\/span>&nbsp;?&gt;\r\n&lt;<span style=\"color:#93c763;\">configuration<\/span>&gt;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span style=\"color:#93c763;\">appSettings<\/span>&gt;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span style=\"color:#93c763;\">add<\/span>&nbsp;<span style=\"color:#678cb1;\">key<\/span>=<span \r\n            style=\"color:#cc7833;\">&quot;<\/span><span style=\"color:#ec7600;\">UserName<\/span><span \r\n            style=\"color:#cc7833;\">&quot;<\/span>&nbsp;<span style=\"color:#678cb1;\">value<\/span>=<span \r\n            style=\"color:#cc7833;\">&quot;<\/span><span style=\"color:#ec7600;\">PresidentSkroob<\/span><span \r\n            style=\"color:#cc7833;\">&quot;<\/span>&nbsp;\/&gt;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span style=\"color:#93c763;\">add<\/span>&nbsp;<span style=\"color:#678cb1;\">key<\/span>=<span \r\n            style=\"color:#cc7833;\">&quot;<\/span><span style=\"color:#ec7600;\">Password<\/span><span \r\n            style=\"color:#cc7833;\">&quot;<\/span>&nbsp;<span style=\"color:#678cb1;\">value<\/span>=<span \r\n            style=\"color:#cc7833;\">&quot;<\/span><span style=\"color:#ec7600;\">12345<\/span><span \r\n            style=\"color:#cc7833;\">&quot;<\/span>&nbsp;\/&gt;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&lt;\/<span style=\"color:#93c763;\">appSettings<\/span>&gt;\r\n&lt;\/<span style=\"color:#93c763;\">configuration<\/span>&gt;<\/pre>\n<p>Fixing this problem is as easy as using Microsoft&#8217;s Data Protection API. Just encrypt the value by calling <code>ProtectedData.Protect()<\/code>. And to decrypt the value, call <code>ProtectedData.Unprotect()<\/code>. <\/p>\n<p>Both methods take an entropy value (salt), and a <code>DataProtectionScope<\/code> value that defines the scope for which the value should be encrypted. The scope may be one of the following: <code>CurrentUser<\/code> &#8211; Only the current user can decrypt the value, or <code>LocalMachine<\/code> &#8211; The value can only be decrypted on the local machine. <code>CurrentUser<\/code> can be a little complicated since it may require you to impersonate users in certain cases, so I just use <code>LocalMachine<\/code>. This does mean that you can&#8217;t ship the config file with the values pre-encrypted because they will not be decryptable on the machine its installed on (it can only be decrypted by the machine that encrypted it). <\/p>\n<p>The functions return a byte array, so I Base64 encode the values prior to writing them to the config file. To do this, I wrote a few extension methods. Here they are:<\/p>\n<p>Encryption:<\/p>\n<pre style=\"border: 2px solid #777; padding: 5px; font-size: 10pt; font-family: Tahoma; color: #f1f2f3; background: #232323;\"><span \r\n            style=\"color: #4f4f4f; background: #272727;\">\/\/\/<\/span><span \r\n            style=\"color: #565f4b; background: #272727;\">&nbsp;<\/span><span \r\n            style=\"color: #4f4f4f; background: #272727;\">&lt;summary&gt;<\/span>\r\n<span style=\"color: #4f4f4f; background: #272727;\">\/\/\/<\/span><span \r\n            style=\"color: #565f4b; background: #272727;\">&nbsp;Converts&nbsp;a&nbsp;string&nbsp;to&nbsp;a&nbsp;protected&nbsp;value&nbsp;(encrypted&nbsp;using&nbsp;Data&nbsp;Protection&nbsp;API)<\/span>\r\n<span style=\"color: #4f4f4f; background: #272727;\">\/\/\/<\/span><span \r\n            style=\"color: #565f4b; background: #272727;\">&nbsp;<\/span><span \r\n            style=\"color: #4f4f4f; background: #272727;\">&lt;\/summary&gt;<\/span>\r\n<span style=\"color: #4f4f4f; background: #272727;\">\/\/\/<\/span><span \r\n            style=\"color: #565f4b; background: #272727;\">&nbsp;<\/span><span \r\n            style=\"color: #4f4f4f; background: #272727;\">&lt;param&nbsp;name=<\/span><span \r\n            style=\"color: #57604a; background: #272727;\">&quot;value&quot;<\/span><span \r\n            style=\"color: #4f4f4f; background: #272727;\">&gt;<\/span><span \r\n            style=\"color: #565f4b; background: #272727;\">The&nbsp;value.<\/span><span \r\n            style=\"color: #4f4f4f; background: #272727;\">&lt;\/param&gt;<\/span>\r\n<span style=\"color: #4f4f4f; background: #272727;\">\/\/\/<\/span><span \r\n            style=\"color: #565f4b; background: #272727;\">&nbsp;<\/span><span \r\n            style=\"color: #4f4f4f; background: #272727;\">&lt;param&nbsp;name=<\/span><span \r\n            style=\"color: #57604a; background: #272727;\">&quot;entropy&quot;<\/span><span \r\n            style=\"color: #4f4f4f; background: #272727;\">&gt;<\/span><span \r\n            style=\"color: #565f4b; background: #272727;\">The&nbsp;entropy.<\/span><span \r\n            style=\"color: #4f4f4f; background: #272727;\">&lt;\/param&gt;<\/span>\r\n<span style=\"color: #4f4f4f; background: #272727;\">\/\/\/<\/span><span \r\n            style=\"color: #565f4b; background: #272727;\">&nbsp;<\/span><span \r\n            style=\"color: #4f4f4f; background: #272727;\">&lt;returns&gt;&lt;\/returns&gt;<\/span>\r\n<span style=\"color:#cc7833;\">public<\/span>&nbsp;<span style=\"color:#cc7833;\">static<\/span>&nbsp;<span \r\n            style=\"color:#cc7833;\">string<\/span>&nbsp;<span \r\n            style=\"color: #ffc66d; background: #141e1e;\">ToProtectedValue<\/span>(&nbsp;<span \r\n            style=\"color:#cc7833;\">this<\/span>&nbsp;<span style=\"color:#cc7833;\">string<\/span>&nbsp;<span \r\n            style=\"color:#d6cb8b;\">value<\/span>,&nbsp;<span style=\"color:#cc7833;\">string<\/span>&nbsp;<span \r\n            style=\"color:#d6cb8b;\">entropy<\/span>&nbsp;)\r\n{\r\n&nbsp;&nbsp;&nbsp;&nbsp;<span style=\"color:#cc7833;\">var<\/span>&nbsp;<span style=\"color:#b9b9ff;\">entropyBytes<\/span>&nbsp;<span \r\n            style=\"color:#cc7833;\">=<\/span>&nbsp;Encoding<span style=\"color:#cc7833;\">.<\/span><span \r\n            style=\"color:#da4939;\">UTF8<\/span><span style=\"color:#cc7833;\">.<\/span><span \r\n            style=\"color:#ffc66d;\">GetBytes<\/span>(&nbsp;<span style=\"color:#d6cb8b;\">entropy<\/span>&nbsp;);\r\n&nbsp;&nbsp;&nbsp;&nbsp;<span style=\"color:#cc7833;\">var<\/span>&nbsp;<span style=\"color:#b9b9ff;\">valueBytes<\/span>&nbsp;<span \r\n            style=\"color:#cc7833;\">=<\/span>&nbsp;Encoding<span style=\"color:#cc7833;\">.<\/span><span \r\n            style=\"color:#da4939;\">UTF8<\/span><span style=\"color:#cc7833;\">.<\/span><span \r\n            style=\"color:#ffc66d;\">GetBytes<\/span>(&nbsp;<span style=\"color:#d6cb8b;\">value<\/span>&nbsp;);\r\n \r\n&nbsp;&nbsp;&nbsp;&nbsp;<span style=\"color:#cc7833;\">var<\/span>&nbsp;<span style=\"color:#b9b9ff;\">securedBytes<\/span>&nbsp;<span \r\n            style=\"color:#cc7833;\">=<\/span>&nbsp;<span \r\n            style=\"color: #f3f3f3; background: #141e1e;\">ProtectedData<\/span><span \r\n            style=\"color:#cc7833;\">.<\/span><span style=\"color:#ffc66d;\">Protect<\/span>(&nbsp;<span \r\n            style=\"color:#b9b9ff;\">valueBytes<\/span>,\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style=\"color:#b9b9ff;\">entropyBytes<\/span>,\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style=\"color:#4f87cc;\">DataProtectionScope<\/span><span \r\n            style=\"color:#cc7833;\">.<\/span><span \r\n            style=\"font-weight:bold;color:#6d9cbe;\">LocalMachine<\/span>&nbsp;);\r\n&nbsp;&nbsp;&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;<span style=\"color:#cc7833;\">return<\/span>&nbsp;<span style=\"color:#b9b9ff;\">securedBytes<\/span><span \r\n            style=\"color:#cc7833;\">.<\/span><span \r\n            style=\"color: #ffc66d; background: #141e1e;\">AsBase64<\/span>();\r\n}<\/pre>\n<p>Decryption:<\/p>\n<pre style=\"border: 2px solid #777; padding: 5px; font-size: 10pt; font-family: Tahoma; color: #f1f2f3; background: #232323;\"><span style=\"color: #4f4f4f; background: #272727;\">\/\/\/<\/span><span \r\n            style=\"color: #565f4b; background: #272727;\">&nbsp;<\/span><span \r\n            style=\"color: #4f4f4f; background: #272727;\">&lt;summary&gt;<\/span>\r\n<span style=\"color: #4f4f4f; background: #272727;\">\/\/\/<\/span><span \r\n            style=\"color: #565f4b; background: #272727;\">&nbsp;Converts&nbsp;a&nbsp;string&nbsp;to&nbsp;a&nbsp;protected&nbsp;value&nbsp;(encrypted&nbsp;using&nbsp;Data&nbsp;Protection&nbsp;API)<\/span>\r\n<span style=\"color: #4f4f4f; background: #272727;\">\/\/\/<\/span><span \r\n            style=\"color: #565f4b; background: #272727;\">&nbsp;<\/span><span \r\n            style=\"color: #4f4f4f; background: #272727;\">&lt;\/summary&gt;<\/span>\r\n<span style=\"color: #4f4f4f; background: #272727;\">\/\/\/<\/span><span \r\n            style=\"color: #565f4b; background: #272727;\">&nbsp;<\/span><span \r\n            style=\"color: #4f4f4f; background: #272727;\">&lt;param&nbsp;name=<\/span><span \r\n            style=\"color: #57604a; background: #272727;\">&quot;protectedString&quot;<\/span><span \r\n            style=\"color: #4f4f4f; background: #272727;\">&gt;&lt;\/param&gt;<\/span>\r\n<span style=\"color: #4f4f4f; background: #272727;\">\/\/\/<\/span><span \r\n            style=\"color: #565f4b; background: #272727;\">&nbsp;<\/span><span \r\n            style=\"color: #4f4f4f; background: #272727;\">&lt;param&nbsp;name=<\/span><span \r\n            style=\"color: #57604a; background: #272727;\">&quot;entropy&quot;<\/span><span \r\n            style=\"color: #4f4f4f; background: #272727;\">&gt;<\/span><span \r\n            style=\"color: #565f4b; background: #272727;\">The&nbsp;entropy.<\/span><span \r\n            style=\"color: #4f4f4f; background: #272727;\">&lt;\/param&gt;<\/span>\r\n<span style=\"color: #4f4f4f; background: #272727;\">\/\/\/<\/span><span \r\n            style=\"color: #565f4b; background: #272727;\">&nbsp;<\/span><span \r\n            style=\"color: #4f4f4f; background: #272727;\">&lt;returns&gt;&lt;\/returns&gt;<\/span>\r\n<span style=\"color:#cc7833;\">public<\/span>&nbsp;<span style=\"color:#cc7833;\">static<\/span>&nbsp;<span \r\n            style=\"color:#cc7833;\">string<\/span>&nbsp;<span \r\n            style=\"color: #ffc66d; background: #141e1e;\">ToUnprotectedString<\/span>(&nbsp;<span \r\n            style=\"color:#cc7833;\">this<\/span>&nbsp;<span style=\"color:#cc7833;\">string<\/span>&nbsp;<span \r\n            style=\"color:#d6cb8b;\">protectedString<\/span>,&nbsp;<span style=\"color:#cc7833;\">string<\/span>&nbsp;<span \r\n            style=\"color:#d6cb8b;\">entropy<\/span>&nbsp;)\r\n{\r\n&nbsp;&nbsp;&nbsp;&nbsp;<span style=\"color:#cc7833;\">var<\/span>&nbsp;<span style=\"color:#b9b9ff;\">entropyBytes<\/span>&nbsp;<span \r\n            style=\"color:#cc7833;\">=<\/span>&nbsp;Encoding<span style=\"color:#cc7833;\">.<\/span><span \r\n            style=\"color:#da4939;\">UTF8<\/span><span style=\"color:#cc7833;\">.<\/span><span \r\n            style=\"color:#ffc66d;\">GetBytes<\/span>(&nbsp;<span style=\"color:#d6cb8b;\">entropy<\/span>&nbsp;);\r\n&nbsp;&nbsp;&nbsp;&nbsp;<span style=\"color:#cc7833;\">var<\/span>&nbsp;<span style=\"color:#b9b9ff;\">encryptedBytes<\/span>&nbsp;<span \r\n            style=\"color:#cc7833;\">=<\/span>&nbsp;<span \r\n            style=\"color: #f3f3f3; background: #141e1e;\">Convert<\/span><span \r\n            style=\"color:#cc7833;\">.<\/span><span style=\"color:#ffc66d;\">FromBase64String<\/span>(&nbsp;<span \r\n            style=\"color:#d6cb8b;\">protectedString<\/span>&nbsp;);\r\n&nbsp;&nbsp;&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;<span style=\"color:#cc7833;\">var<\/span>&nbsp;<span style=\"color:#b9b9ff;\">decryptedBytes<\/span>&nbsp;<span \r\n            style=\"color:#cc7833;\">=<\/span>&nbsp;<span \r\n            style=\"color: #f3f3f3; background: #141e1e;\">ProtectedData<\/span><span \r\n            style=\"color:#cc7833;\">.<\/span><span style=\"color:#ffc66d;\">Unprotect<\/span>(&nbsp;<span \r\n            style=\"color:#b9b9ff;\">encryptedBytes<\/span>,\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style=\"color:#b9b9ff;\">entropyBytes<\/span>,\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<span style=\"color:#4f87cc;\">DataProtectionScope<\/span><span \r\n            style=\"color:#cc7833;\">.<\/span><span \r\n            style=\"font-weight:bold;color:#6d9cbe;\">LocalMachine<\/span>&nbsp;);\r\n&nbsp;&nbsp;&nbsp;&nbsp;\r\n&nbsp;&nbsp;&nbsp;&nbsp;<span style=\"color:#cc7833;\">return<\/span>&nbsp;Encoding<span style=\"color:#cc7833;\">.<\/span><span \r\n            style=\"color:#da4939;\">UTF8<\/span><span style=\"color:#cc7833;\">.<\/span><span \r\n            style=\"color:#ffc66d;\">GetString<\/span>(&nbsp;<span style=\"color:#b9b9ff;\">decryptedBytes<\/span>&nbsp;);\r\n}<\/pre>\n<p>After encrypting these values appropriately, your config file will look like this:<\/p>\n<pre style=\"border: 2px solid #777; padding: 5px; font-size: 10pt; font-family: Tahoma; color: #f1f2f3; background: #232323;\">&lt;?<span \r\n            style=\"color:#93c763;\">xml<\/span>&nbsp;<span style=\"color:#678cb1;\">version<\/span>=<span \r\n            style=\"color:#cc7833;\">&quot;<\/span><span style=\"color:#ec7600;\">1.0<\/span><span \r\n            style=\"color:#cc7833;\">&quot;<\/span>&nbsp;<span style=\"color:#678cb1;\">encoding<\/span>=<span \r\n            style=\"color:#cc7833;\">&quot;<\/span><span style=\"color:#ec7600;\">utf-8<\/span><span \r\n            style=\"color:#cc7833;\">&quot;<\/span>&nbsp;?&gt;\r\n&lt;<span style=\"color:#93c763;\">configuration<\/span>&gt;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span style=\"color:#93c763;\">appSettings<\/span>&gt;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span style=\"color:#93c763;\">add<\/span>&nbsp;<span style=\"color:#678cb1;\">key<\/span>=<span \r\n            style=\"color:#cc7833;\">&quot;<\/span><span style=\"color:#ec7600;\">UserName<\/span><span \r\n            style=\"color:#cc7833;\">&quot;<\/span>&nbsp;<span style=\"color:#678cb1;\">value<\/span>=<span \r\n            style=\"color:#cc7833;\">&quot;<\/span><span style=\"color:#ec7600;\">ADZgAAwAAAABAAAACLYg+TEHoFh88HcfvNTg0yAAAAAASAAACgAAAAEAAAAMFLpAQAAANCMnd8BFdERjHoAwE\/Cl+sBAAAA8BdWygYhjUWaw3teJQo04AQAAAACAAAAAAXFMCeBnOURIBAl2DJoQAAAAN7+sLiIZl+x9vPjC16wcmRQAAADS4d9bdlcLF9CmKrsbgGWPM29zAQ==<\/span><span \r\n            style=\"color:#cc7833;\">&quot;<\/span>&nbsp;\/&gt;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&lt;<span style=\"color:#93c763;\">add<\/span>&nbsp;<span style=\"color:#678cb1;\">key<\/span>=<span \r\n            style=\"color:#cc7833;\">&quot;<\/span><span style=\"color:#ec7600;\">Password<\/span><span \r\n            style=\"color:#cc7833;\">&quot;<\/span>&nbsp;<span style=\"color:#678cb1;\">value<\/span>=<span \r\n            style=\"color:#cc7833;\">&quot;<\/span><span style=\"color:#ec7600;\">AQAAANCMnd8BFdERjHoAwE\/Cl+sBAAAA8BdWygYhjUWaw3teJQo04AQAAAACAAAAAAADZgAAwAAAABAAAAAhfu4ghotvmXphmGWOHFfbAAAAAASAAACgAAAAEAAAAMBMv0D9\/mDwktrFSVNIPcwQAAAAwg2IDL1+MOHwdx2A1cax2RQAAACZLB62COjpupN2+pW4yT8LKR5Udg==<\/span><span \r\n            style=\"color:#cc7833;\">&quot;<\/span>&nbsp;\/&gt;\r\n&nbsp;&nbsp;&nbsp;&nbsp;&lt;\/<span style=\"color:#93c763;\">appSettings<\/span>&gt;\r\n&lt;\/<span style=\"color:#93c763;\">configuration<\/span>&gt;<\/pre>\n<p>Now you and your clients can sleep a little better at night knowing their sensitive information is just a bit more secure. <\/p>\n","protected":false},"excerpt":{"rendered":"<p>When we are writing software for our clients, we have a fiduciary responsibility to ensure the security of their site. One way to increase security is to ensure that passwords and other sensitive information are not laying around in our config files unsecured (in plain text). All too many times I have seen something like [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[27,31,48,55],"tags":[79,93,30,100],"class_list":["post-416","post","type-post","status-publish","format-standard","hentry","category-net","category-c","category-configuration","category-security","tag-net","tag-configuration","tag-csharp","tag-security"],"aioseo_notices":[],"_links":{"self":[{"href":"http:\/\/architester.com\/blog\/wp-json\/wp\/v2\/posts\/416","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/architester.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/architester.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/architester.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"http:\/\/architester.com\/blog\/wp-json\/wp\/v2\/comments?post=416"}],"version-history":[{"count":12,"href":"http:\/\/architester.com\/blog\/wp-json\/wp\/v2\/posts\/416\/revisions"}],"predecessor-version":[{"id":431,"href":"http:\/\/architester.com\/blog\/wp-json\/wp\/v2\/posts\/416\/revisions\/431"}],"wp:attachment":[{"href":"http:\/\/architester.com\/blog\/wp-json\/wp\/v2\/media?parent=416"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/architester.com\/blog\/wp-json\/wp\/v2\/categories?post=416"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/architester.com\/blog\/wp-json\/wp\/v2\/tags?post=416"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}