高级加密标准 (AES) 和安全断言标记语言 (SAML) 的 Web 安全

拥有更安全的渠道在整个网络上传输用户信息的最佳方法

密码学

网络上的大多数问题都与安全问题以及在网络中保存和传输敏感数据有关。所以我们必须在它上面提供一个安全的系统。在网络中建立安全连接的最流行和最实用的方法是加密技术。加密技术是加密和解密数据以确保数据安全的过程。例如,在下图中,Bob 想要向 Alice 发送数据。此数据称为加密过程的消息和输入参数。然后将具有加密功能的特定密钥添加到此消息中并生成密文,即我们的加密消息,因此此消息通过网络,黑客正在等待窃取此数据。

 

在另一阶段,Alice 等待接收 Bob 的消息,在这一侧,有使用相同密钥解密消息的解密函数。这个秘密密钥与鲍勃一方的密钥完全相似。因此,具有相同密钥和密文(加密密钥)的解密函数将为 Alice 生成解密消息,最后 Alice 将收到 Bob 的消息。此过程称为对称加密。

这个过程中最大的问题是提供一个强大而复杂的密钥。因为加密和解密算法在互联网上可用,并且使用几乎相似的步骤和功能来加密数据和更改这些算法是无用的,因为黑客很容易找到它们。因此,我们必须集中精力制作电源密钥,以确保机密数据的安全。

  1. 密码学对于任何安全问题来说都是非常棒的工具。
  2. 但是密码学不适合幼稚的用户做出伤害自己的动作,尤其是对于社交攻击者。
  3. 密码学需要创新新方法,因为使用旧的加密系统与不使用它一样糟糕。
  4. 如果密码学实施不正确,则只能正确满足您的要求。

一些安全通信解决方案

  1. Web 流量:HTTPS -> 安全套接字层 (SSL/TLS)
  2. 无线流量:GSM:802.11 或 WPA2:蓝牙
  3. 磁盘上的加密文件

 

高级加密标准 (AES)

AES 是使用相同密钥并基于Rijndael密码算法的加密技术之一。AES 基于替换和置换函数,并使用复杂的方法来生成强大且几乎牢不可破的密钥,这是我们的目标,以便通过网络传输我们的敏感数据。

第一步,AES 将长度为 128 位的密钥扩展到十多个密钥,其中每个密钥的长度为 128 位,即生成的密钥构建变体周期数。作为输入参数的消息将与这些键混合。AES 只AddRoundKey在 K 0 中使用“ ”函数,在 K n 中使用“ SubBytes”、“ Shiftrows”和“ AddRoundKey”,而在 AES 中在 K 2到 K n-1 中使用所有四个函数“ AddRoundKey”、“ SubBytes”、“ Shiftrows”和“ AddRoundKey”。最终,消息或明文通过这些复杂的功能,将被转换为加密消息或密文。

AES 反向使用此模式从加密消息生成相同的消息。AES 将消息文本和密钥转换为四乘四矩阵,因为按矩阵形式工作比原始形式更容易。看下图,对AES算法内部发生的事情有更清晰的想象。

添加轮键

此函数通过 XOR 函数混合 K i,j和 M i,j。这意味着 AES从消息和密钥中提取第i 行和第j列,并对这些重合的行和列应用 XOR 函数并产生 C i,j。在下图中,将在蓝色密钥和红色消息之间应用 XOR 以生成橙色密码。

子字节

此函数从具有特定模式和步骤的替换表中找到对 M i,j的替换,并将此新替换为 M ~ i,j。这意味着 AES从消息中提取第i行和第j列,并对消息矩阵的每一行和每列应用替换函数并生成密码矩阵 C i,j。

混合列

有一个固定矩阵 C,它将影响消息矩阵。在第一步,它不会改变第一行,而是将第二行向左移动,并且向左移动第三行,此外还为此应用 XOR 函数。

移行

此函数选取消息矩阵并且不更改该矩阵的第一行,之后对于第二行,移动一个单元格,以便将 M 1,0替换为 M 1,3。对于第二行,移动二,对于第三行,移动三。

 

 

 我已经将下图说明为 AES 内部更深入的操作。DES 和 3DES 算法与 AES 几乎相似,例外是 3DES 是 168 位,它比 AES 多一些位,但它只是使用置换函数来生成密钥,而 AES 使用置换和替换函数,并且花费的时间更少,而不是3DES。

我的网络安全解决方案

我想发布一个带有身份验证和授权部分的解决方案来识别用户。身份验证使我们可以通过获取用户名和密码来了解用户的声明是否正确。有一个解决方案可以将这部分作为两步验证,首先通过获取密码,然后通过生物识别标志。在这种状态下,如果有人窃取了用户的密码,黑客将无法访问该用户的个人资料。

下一部分是授权,它与权限管理有关,确定特定角色是否有权访问和查看特定部分。例如,此处(在电子医疗保健系统中),医生有权访问其患者的健康信息并读取或写入 EHR。

第三部分是加密技术(AES)。正如我上面提到的,AES 使用不同的功能来加密来自黑客的数据。因此可以将数据库中的数据保存为加密文本而不是纯文本以增加安全问题。

 

关于我的解决方案的更多描述

我的解决方案是使用生物识别标志并将此密钥与密钥混合,以便在 AES 中生成更强大和安全的密钥。该生物特征密钥可以从指纹或角膜标志中提取。如今,可以通过手机(例如iphone)捕获指纹,并且可以将这些数据转换为第二密钥矩阵并将其与我们拥有的强密钥的秘密密钥混合。这些标志随时可用,我们不会忘记它们,黑客无法获得它们,因此这是保持数据机密性的一个很好的解决方案。

如何使用和实施代码

首先,打开Visual Studio 2013 -> File (Menu) -> New Project -> ASP.NET MVC -> Empty Controller -> Add New Controller

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Security.Cryptography;
using System.Text;
using System.Web;
using System.Web.Mvc;

namespace WebSecurity.Controllers
{
    public class AESController : Controller
    {
        //
        // GET: /AES/

        public ActionResult Index()
        {
            ViewData["Encrypted"] = TempData["TEncrypted"];
            ViewData["Decrypted"] = TempData["TDecrypted"];
            return View();
        }

        //txtforEN is PlainText
        //Key is Public Secret Key 
        [HttpPost]
        public ActionResult Encryption(string Text, string Key)
        {
            // Convert String to Byte

            byte[] MsgBytes = Encoding.UTF8.GetBytes(Text);
            byte[] KeyBytes = Encoding.UTF8.GetBytes(Key);

            // Hash the password with SHA256
            //Secure Hash Algorithm
            //Operation And, Xor, Rot,Add (mod 232),Or, Shr
            //block size 1024
            //Rounds 80
            //rotation operator , rotates point1 to point2 by theta1=> p2=rot(t1)p1
            //SHR shift to right
            KeyBytes = SHA256.Create().ComputeHash(KeyBytes);

            byte[] bytesEncrypted = AES_Encryption(MsgBytes, KeyBytes);

            string encryptionText = Convert.ToBase64String(bytesEncrypted);

            TempData["TEncrypted"] = encryptionText;
            return RedirectToAction("Index");
        }

        public byte[] AES_Encryption(byte[] Msg, byte[] Key)
        {
            byte[] encryptedBytes = null;

            //salt is generated randomly as an additional number to 
            //hash password or message in order o dictionary attack
            //against pre computed rainbow table
            //dictionary attack is a systematic way to test 
            //all of possibilities words in dictionary weather or not is true?
            //to find decryption key
            //rainbow table is precomputed key for cracking password
            // Set your salt here, change it to meet your flavor:
            // The salt bytes must be at least 8 bytes.  == 16 bits
            byte[] saltBytes = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 };

            using (MemoryStream ms = new MemoryStream())
            {
                using (RijndaelManaged AES = new RijndaelManaged())
                {
                    AES.KeySize = 256;
                    AES.BlockSize = 128;

                    var key = new Rfc2898DeriveBytes(Key, saltBytes, 1000);
                    AES.Key = key.GetBytes(AES.KeySize / 8);
                    AES.IV = key.GetBytes(AES.BlockSize / 8);

                    AES.Mode = CipherMode.CBC;

                    using (var cs = new CryptoStream
                          (ms, AES.CreateEncryptor(), CryptoStreamMode.Write))
                    {
                        cs.Write(Msg, 0, Msg.Length);
                        cs.Close();
                    }
                    encryptedBytes = ms.ToArray();
                }
            }

            return encryptedBytes;
        }

        [HttpPost]
        public ActionResult Decryption(string Text2, string Key2)
        {
            // Convert String to Byte
            byte[] MsgBytes = Convert.FromBase64String(Text2);
            byte[] KeyBytes = Encoding.UTF8.GetBytes(Key2);
            KeyBytes = SHA256.Create().ComputeHash(KeyBytes);

            byte[] bytesDecrypted = AES_Decryption(MsgBytes, KeyBytes);

            string decryptionText = Encoding.UTF8.GetString(bytesDecrypted);

            TempData["TDecrypted"] = decryptionText;
            return RedirectToAction("Index");
        }

        public byte[] AES_Decryption(byte[] Msg, byte[] Key)
        {
            byte[] decryptedBytes = null;

            // Set your salt here, change it to meet your flavor:
            // The salt bytes must be at least 8 bytes.
            byte[] saltBytes = new byte[] { 1, 2, 3, 4, 5, 6, 7, 8 };

            using (MemoryStream ms = new MemoryStream())
            {
                using (RijndaelManaged AES = new RijndaelManaged())
                {
                    AES.KeySize = 256;
                    AES.BlockSize = 128;

                    var key = new Rfc2898DeriveBytes(Key, saltBytes, 1000);
                    AES.Key = key.GetBytes(AES.KeySize / 8);
                    AES.IV = key.GetBytes(AES.BlockSize / 8);

                    AES.Mode = CipherMode.CBC;

                    using (var cs = new CryptoStream
                          (ms, AES.CreateDecryptor(), CryptoStreamMode.Write))
                    {
                        cs.Write(Msg, 0, Msg.Length);
                        cs.Close();
                    }
                    decryptedBytes = ms.ToArray();
                }
            }

            return decryptedBytes;
        }
    }
}

 右键单击索引(操作)-> 选择“添加视图”。

@{
    ViewBag.Title = "Index";
    Layout = "~/Views/Shared/_Layout.cshtml";
}
 
<h2>Encryption And Decryption</h2>
 
<div style="color:red;" id="EncryptedText"
>Encrypted Message: @ViewData["Encrypted"]</div>
 
<div style="color:red;" id="DecryptedText"
>Decrypted Message: @ViewData["Decrypted"]</div>
 
<pre>
@using(Html.BeginForm("Encryption", "AES", FormMethod.Post))
{
     &lt;label id="lbk1">Key:&lt;/label>
     &lt;input name="Key" id="Key" type="text" />
    <br />
<br />
     &lt;label id="lbk2">Message:&lt;/label>
     &lt;input name="Text" id="Text" type="text" />
    <br />
<br />
    &lt;input id="btnEncryption" type="submit" value="Encryption" />
    <br />  
    <br />          
}

 

如何测试应用程序

对于加密:

  1. 输入 Key 如:Key=122
  2. 输入消息:消息Mahsa
  3. 按“加密”按钮
  4. 您将看到密码文本 -->加密消息:7gkI7SpPzsOiJ8O2OO2jOQ==

对于解密:

  1. 输入相同的密钥=“ 122 ”
  2. 输入加密消息 --> 7gkI7SpPzsOiJ8O2OO2jOQ==
  3. 按“解密”按钮
  4. 您将看到:解密的消息:Mahsa

 

安全断言标记语言 (SAML)

SAML 是基于 XML 的开放标准,它格式化数据,这些数据应该在身份提供者和服务提供者之间将用户信息作为加密数据传输。它包括一个包含此加密数据的特定标签。

<saml:Assertion ..> 
"includes important message from identity provider to service provider
"Who is this user (Attribute Identity)
 "Is he/she allowed to consume service?
</saml:Assertion>

 

当服务提供者通过安全通道向身份提供者调用直接查询时,将请求 SAML 协议。SAML 中流行的用途是用于 Web 浏览器单点登录 (SSO)。在这个问题中,使用 SAML 会发生以下问题:


 

  1. 请求目标资源

    用户通过 Chrome 或 Mozila 等网络浏览器在地址栏中输入www.sample.com,例如:http : //www.stackoverflow.com/,并从 stackoverflow 作为服务提供者发送使用特定服务的请求。此用户可以使用堆栈身份验证直接输入其用户名和密码,或从登录页面选择身份验证选项之一。

  2. 重定向到 SSO 服务

    假设用户选择 Google 选项进行身份验证过程,那么 stackoverflow 会将他/她从http://www.stackoverflow.com/重定向到https://accounts.google.com

  3. 请求 SSO 服务

    在此示例中,stackoverflow 是为用户提供所需服务的服务提供商,而 Google.com 是为用户执行单点登录的身份提供商。谷歌通过请求一些属于用户的信息(例如用户名和密码)来识别用户,并检查这些凭据是否有效。身份提供者使用 LDAP、Radius 和 Active Directory 等目录服务进行身份验证。

  4. 用 XHTML 表单响应

    在这个阶段,用户应该作为身份提供者按下 Google.com 内的接受按钮,以允许他/她的一些信息(例如用户名和电子邮件)传递并传输给服务提供商。当他/她这样做时,身份提供者以 XHTML 形式(下面的代码)响应服务提供者。

    <form method="post" action="https://sp.example.com/SAML2/SSO/POST" ...>
        <input type="hidden" name="SAMLResponse" value="response" />
        <input type="submit" value="Submit" />
    </form>

  5. 请求断言消费者服务

    如果在上述 XHTML 中,身份提供者允许用户使用来自服务提供者的服务,因此用户重定向到服务提供者,而他/她是该站点的有效用户并且可以使用所需的服务。(虽然在这个阶段,服务提供者进行授权过程来检查他/她使用每个服务的访问权限)。

  6. 重定向到目标资源

    在这个阶段,服务提供者进行授权过程来检查他/她使用每个服务的访问权限,然后用户将被重定向到目标资源。

  7. 请求目标资源

    用户向服务提供者请求特定资源,正如我上面提到的,如果服务提供者确认了许可,那么用户就可以使用它。如http://astronomy.stackexchange.com/

  8. 响应请求的资源

    如果用户有权访问该服务,则服务提供者会将用户重定向到资源。

字典

在本节中,我已经解释了一些需要更多描述的具体词。这部分可以解决误解,并在我的写作风格中显示出我打算使用这些词的意图。

XML

可扩展标记语言是一种标记语言,它包含对文档进行编码和格式化的特定规则,以便它们对人和机器都可读。XML 可用于处理 Web 应用程序和服务以组织不同类型的数据结构和人类语言。

XML 有规则来定义如何安排我们的内容。它包括“ <div></div>”标签,“ ”内的class属性等属性,最后我们的数据位于标签内,例如“ ”内,其声明以“ ”开头。<div class=”class1”></div>Hello“<div class=”class1”>Hello</div>”<?xml version="1.0" encoding="UTF-8"?>

安全令牌

安全令牌是一种为身份验证过程生成密钥的设备。它是一个额外的工具,可以提高安全性,以检测用户是否真的声称自己是谁。它是密钥生成器、USB 连接器和蓝牙无线等设备。它为密码学问题(加密和解密功能)存储了一个密钥,该密钥可以是生物特征标志,例如指纹或数字签名。这个具有特定密码功能的密钥可以生成一个新的数字号码,用户在用户名和密码后输入这个数字号码。这个密钥证明用户的主张是他/她真正主张的与否。图中,用户输入用户名和密码,然后按设备上的按键,输入数字“ 54392971”作为密码,然后点击“登录”。

 

服务提供者

服务提供商被称为公司,向其客户提供服务列表。这些服务分为电信、应用、存储场所和互联网。

身份提供者

身份提供者是第三方,除了两部分(认证情况有消费者作为用户和供应商作为服务提供者两部分)检测用户是否为授权用户并将用户的一些重要信息提供给服务提供者,最终授权用户获得许可消费服务。

例如,stackoverflow.com 是一个供应商(服务提供商),您可以在相关部分提出您的问题。如果用户想登录此站点,它有一些选项可以这样做,例如使用 Google、Facebook、雅虎、LiveJournal、WordPress、Blogger、Verisign 和 AOL 或通过 stackoverflow 登录。如果用户选择stackoverflow,那么他/她应该为此站点创建用户名和密码,并在此处再次输入所有重复信息。每当用户选择身份提供者的其他选项时,他就会从 stackoverflow 重定向到这些网站,并向他们输入特定的用户名和密码,然后这些网站决定该用户是否有效?如果用户有效,那么用户的电子邮件地址等信息将被传递到 stackoverflow 站点。

 

重定向到 Google 进行身份验证(使用 Google 帐户登录 Stackoverflow.com)。

LDAP

轻型目录访问协议 (LDAP) 是一种 Internet 协议。LDAP 通过为每个数据创建索引并仅过滤所需的特定项目来查找信息。

活动目录

Active Directory 是一种基于 Windows 域的目录服务,具有身份验证和授权服务。用户登录windows域中的计算机,Active Directory检查LDAP提交的密码,如果用户名和密码有权访问则Active Directory,则允许其使用所需的服务。

视窗域

Windows 域是一种网络,所有用户和计算机及其外围设备都在中央计算机上注册。

联合身份提供者

联合身份是一种在用户身份(用户名和密码)和其他身份管理之间建立联系的技术,以便对用户进行身份验证并通知源节点用户是有效的。这意味着您可以只有一个用户名和密码,并且在多个网站上都有效。单点登录是联合身份的子集。

U-Prove

U-Prove 是一种加密技术,它揭示了想要浏览多个网站的用户的最少信息,尤其是当用户与身份提供者交互时。U-Prove 很难跟踪用户想要做什么。U-Prove 令牌通过两个功能加密信息。首先,没有相关句柄的信息的加密“包装”导致避免跟踪用户。其次,用户在验证者政策过程中披露的信息最少,例如“年龄”,而没有明确披露“出生日期”。

开放ID

OpenID 是一种允许用户继续其身份验证过程的协议,被称为“依赖方”的其他网站称为第三方,例如 Google、Microsoft、Facebook、AOL 等。

无状态和有状态

无状态是一种在客户端和服务器之间建立独立请求和响应的通信协议。相比之下,Stateful 不需要服务器保存有关请求者和响应者之间通信的信息,而有状态需要服务器保存有关其状态的信息。互联网协议、互联网的 IP 基础和超文本传输​​协议、HTTP、网络数据通信的基础都是无状态的例子。传输控制协议 TCP 是 Stateful 的示例,它在客户端和服务器之间提供可靠且经过错误检查的通信。

结论

我在我的应用程序中使用了最流行的加密技术之一作为 AES。AES 是一种对称加密函数,在发送方和接收方使用相同的密钥,AES 产生强密钥,黑客无法破解它。因此 AES 是保持数据机密性和完整性的好方法。

 

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值