目录
密码
高级加密标准(AES)
加密钥(AddRoundKey):
替换字节(SubBytes):
混合列(MixColumns):
移位行(Shift Rows):
我的解决方案在Web上拥有更多安全性
我的解决方案的更多描述
如何使用和实现代码
如何测试应用程序
安全断言标记语言(SAML)
请求目标资源
重定向到SSO服务
请求SSO服务
使用XHTML表单响应
请求断言使用者服务
重定向到目标资源
请求目标资源
响应请求的资源
字典
XML
安全令牌
服务提供者
身份提供者
LDAP
活动目录
Windows域名
联合身份提供商
U-Prove
OpenID
无状态和有状态
结论
- 下载源代码 - 1146 KB
网络中的大多数问题都是安全问题,而且由于在网络中保存和转换敏感数据,因此我们必须在其上提供安全系统。在网络中建立安全连接的最流行和最实用的方法是加密技术。密码技术是加密和解密数据的过程,以保证数据的安全。例如,在下图中,Bob想要向Alice发送数据。此数据称为加密过程的消息和输入参数。然后将具有加密功能的特定密钥添加到此消息并生成密文,这是我们的加密消息,因此该消息通过网络传输,而黑客也在网上等待劫持此数据。
在另一个阶段,Alice等待接收Bob的消息,并且在那一侧有解密功能,它使用相同的密钥来解密消息。这个秘密密钥与Bob的密钥完全相似。因此,具有相同密钥和密文(加密密钥)的解密功能将为Alice产生解密消息,最后Alice将接收Bob的消息。此过程称为对称加密。
这个过程中最大的问题是提供强大而复杂的密钥。因为加密和解密算法在互联网上可用的,并且使用几乎相似的步骤和功能来加密数据,并且改变这些算法是无用的,因为黑客可以容易地找到它们。因此,我们必须集中精力生成电源密钥以保护安全的机密数据。
- 对于任何安全问题,密码学都是非常棒的工具。
- 但是密码学并不适合天真的用户采取行动来伤害自己,特别是对于社交攻击者。
- 密码学需要创新新方法,因为使用旧的加密系统与不使用它一样糟糕。
- 如果密码学实现不正确,除了正确满足您的要求之外。
一些安全通信解决方案
- 网络流量:HTTPS - >安全套接字层(SSL / TLS)
- 无线流量:GSM:802.11或WPA2:蓝牙
- 磁盘上的加密文件
AES是使用相同密钥的加密技术之一,并且在Rijndael密码算法上。AES基于替换和置换功能,并使用复杂的方法来生成强大且几乎牢不可破的密钥,这是我们通过网络传输敏感数据的目的。
第一步,AES扩展密钥,128位长度到十个以上密钥,每个密钥具有128位长度,即生成的密钥构建变量周期的数量。作为输入参数的消息将与这些键混合。AES只在K 0中使用“AddRoundKey”函数,在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函数,并生成 Ci,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。
我想发布一个带有身份验证和授权部分的解决方案来识别用户。身份验证通过获取用户名和密码让我们知道用户的声明是否正确。有一个解决方案可以将此部分作为两步验证,首先是获取密码,然后是生物识别符号。在这种状态下,如果有人窃取了用户的密码,那么黑客就无法访问该用户的个人资料。
下一部分是与权限管理相关的授权,并确定特定角色是否有权访问和查看特定部分。例如,在这里(在EHealth护理系统中)医生有权访问他或她的患者的健康信息并读取或写入EHR。
第三部分是密码技术(AES)。正如我上面提到的,AES使用不同的功能来加密来自黑客的数据。因此,数据库中的数据可以保存为加密文本而不是纯文本,以增加安全性问题。
我的解决方案是使用生物识别标志并将此密钥与密钥混合,以便在AES中生成更强大、更安全的密钥。该生物识别密钥可以从指纹或角膜标志中提取。现在可以通过iphon等手机捕获指纹,这些数据可以转换为第二密钥矩阵并将其与密钥混合,我们有强密钥。这些标志随时可供我们使用,我们不会忘记它们,黑客无法实现这些标志,因此保持数据机密性是一个很好的解决方案。
首先打开visual studio 2013 - > File(Menu) - > New Project - > ASP.NET MVC - > Empty
控制器 - >添加新控制器
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 wheather 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;
}
}
}
右键单击Index(操作) - >选择“添加视图”
@{
ViewBag.Title = "Index";
Layout = "~/Views/Shared/_Layout.cshtml";
}
Encryption And Decryption
Encrypted Message: @ViewData["Encrypted"]
Decrypted Message: @ViewData["Decrypted"]
@using(Html.BeginForm("Encryption", "AES", FormMethod.Post))
{
<label id="lbk1">Key:</label><input name="Key" id="Key" type="text" />
<label id="lbk2">Message:</label><input name="Text" id="Text" type="text" />
<input id="btnEncryption" type="submit" value="Encryption" />
}
如何测试应用程序
对于加密:
1.输入密钥,例如:Key = 122
2.输入消息:Message = Mahsa
3.按“加密”按钮
4.您将看到密文 - > 加密消息:7gkI7SpPzsOiJ8O2OO2jOQ ==
对于解密
5.输入相同Key=“122”
6.输入加密消息 - > 7gkI7SpPzsOiJ8O2OO2jOQ ==
7.按“解密 ”按钮
8.您将看到:解密的消息:Mahsa
安全断言标记语言(SAML)SAML是一种基于XML的开放式标准,它对数据进行格式化,以在身份提供程序和服务提供程序之间将用户信息作为加密数据传输。它包括包含此加密数据的特定标记。
"includes important message from identity provider to service provider
"Who is this user (Attribute Identity)
"Is he/she allowed to consume service?
当服务提供者通过安全通道向身份提供者调用直接查询时,请求SAML协议。SAML常用于Web浏览器单点登录(SSO)。在这个问题中,使用SAML会发生以下问题:
请求目标资源用户通过浏览器(例如chrome或Mozila)在地址栏内输入www.sample.com,例如:http://www.stackoverflow.com/并发送请求以使用stackoverflow中的特定服务作为服务提供者。此用户可以直接使用堆栈身份验证输入其用户名和密码,也可以从登录页面中选择一个身份验证选项。
重定向到SSO服务假设用户选择Google选项进行身份验证处理,然后stackoverflow会将他/她从http://www.stackoverflow.com/重定向到https://accounts.google.com。
请求SSO服务在此示例中,stackoverflow是为用户提供所需服务的服务提供者,而Google.com是为用户执行单点登录的身份提供者。Google通过请求属于用户的某些信息(如用户名和密码)来识别用户,并检查这些凭据是否有效。身份提供程序使用LDAP,Radius和Active Directory等目录服务进行身份验证处理。
使用XHTML表单响应在此阶段,用户应按Google.com内的接受按钮作为身份提供者,以允许他/她的某些信息(如用户名和电子邮件)传递给服务提供者。当他/她这样做时,身份提供者以XHTML形式(下面的代码)响应服务提供者。
input type="hidden" name="SAMLResponse" value="response" />
input type="submit" value="Submit" />
form>
请求断言使用者服务
如果在上述XHTML身份提供者中允许用户使用来自服务提供者的服务,那么当用户是该站点的有效用户并且可以使用所需的服务时,用户将重定向到服务提供程序。(尽管在此阶段,服务提供者进行授权过程以检查他/她对每项服务的访问权限)。
重定向到目标资源在此阶段,服务提供者进行授权处理以检查他/她使用每个服务的访问权限,然后将用户重定向到目标资源。
请求目标资源用户请求来自服务提供者的特定资源,如上所述,如果从服务提供者确认权限,则用户可以使用它。如http://astronomy.stackexchange.com/
响应请求的资源如果用户有权访问该服务,则服务提供者将用户重定向到资源。
在本节中,我已经解释了一些需要更多描述的特定单词。这部分可以解决误解,并表达我的意图,在我的写作风格中使用这些词。
XML可扩展标记语言是一种标记语言,包括对文档进行编码和格式化的特定规则,以便人类和机器可读。XML对于处理Web应用程序和服务以组织不同类型的数据结构和人类语言非常有用。
XML具有定义如何安排内容的规则。它包括标签“
安全令牌是为身份验证过程生成密钥的设备。这是一个额外的工具,可以提高安全性,以检测用户是否真的声明是谁。它是密钥生成器,USB连接器和蓝牙无线等设备。它为密码学问题(加密和解密函数)提供了密钥,这个密钥可以是生物识别标志,如指纹或数字签名。具有特定加密功能的该密钥可以生成新的数字号码,用户在输入用户名和密码后输入该数字号码。这个密钥证明了用户的声明是他/她是否真的声明。在图中,用户应输入用户名和密码,然后按设备上的键并输入密码“54392971”,然后单击“登录”。
服务提供商被公司调用,其为客户提供服务列表。这些服务分为电信,应用程序,存储位置和互联网。
身份提供者身份提供者是第三方,外部由两部分组成(认证情况有两部分,消费者为用户,供应商为服务提供者),用于检测用户是否为授权用户,并将一些重要的用户信息提供给服务提供者,最终授权用户拥有获得服务的许可。
例如,stackoverflow.com是供应商(服务提供者),您可以在相关部分中提出您的问题。如果用户想要登录此站点,则可以选择使用Google,Facebook,Yahoo,LiveJournal,WordPress,Blogger,Verisign和AOL或者stackoverflow。如果用户选择stackoverflow,那么他/她应该为该站点创建用户名和密码,并在此处再次输入所有重复信息。每当用户选择其他选项作为身份提供者,然后将从stackoverflow重定向到这些网站并输入特定的用户名和密码,然后这些网站决定该用户是否有效?如果用户有效,则用户的信息(如电子邮件地址)将传递到stackoverflow站点。
重定向到Google以进行身份验证问题
(使用Google帐户登录Stackoverflow.com)
LDAP轻量级目录访问协议(LDAP)是一种Internet协议。LDAP通过为每个数据创建索引并仅过滤所需的特定项来查找信息。
活动目录Active Directory是基于Windows域的目录服务,具有用于进行身份验证和授权的服务。用户登录到Windows域中的计算机,并且活动目录通过LDAP检查提交的密码,如果用户名和密码有权访问,则活动目录允许它使用所需的服务。
Windows域名Windows域是一种网络,因此所有用户和计算机及其外围设备都在中央计算机上注册。
联合身份提供商联合身份是一种在用户身份(用户名和密码)与其他身份管理之间建立链接以便对用户进行身份验证并通知源节点用户有效的技术。这意味着您只能拥有一个用户名和密码,并且可以在多个网站上有效。单点登录是联合身份的子集。
U-ProveU-Prove是一种加密技术,可以显示有关想要浏览多个网站的用户的最低信息,尤其是当用户与身份提供者进行交互时。U-Prove很难跟踪用户想要做什么。U-Prove令牌使用两个功能加密信息。首先,没有相关处理的信息的加密“包装”导致避免跟踪用户。其次,用户在验证者政策过程中披露其信息的最小值,例如“年龄”,而没有明确显示“出生日期”。
OpenIDOpenID是一种允许用户继续其他网站认证过程的协议,被称为“依赖方”,作为第三方,如谷歌,微软,Facebook,美国在线等。
无状态和有状态无状态是一种通信协议,在客户端和服务器之间建立独立的请求和响应。它不需要服务器来保持其关于请求者和响应者之间的通信的信息,而有状态需求服务器保持关于其状态的信息。互联网协议,互联网和超文本传输协议的IP基础,HTTP,网络上数据通信的基础是无状态的例子。传输控制协议TCP是有状态的示例,它在客户端和服务器之间提供可靠且错误检查的通信。
结论我在我的应用程序中使用了最流行的加密技术之一作为AES。AES是一种对称加密功能,通过在发送方和接收方使用相同的密钥,AES产生强大的密钥,黑客无法破解它。因此AES是保持数据机密和完整性的好方法。
原文地址:https://www.codeproject.com/Articles/1023379/Security-On-The-Web-By-Advanced-Encryption-Standar