网站网络安全技术





5.00/5 (1投票)
本文重点关注如何避免可在网页中解决的“通过网络传输”的安全问题。
概述
数字信息安全是多方面的,从通过加密保护数据以实现位置之间的安全传输,到客户端和服务器的物理安全、加密数据库以及VPN的使用。人为因素至关重要,因为用户可能会从USB设备下载恶意软件或勒索软件,或点击电子邮件链接到虚假的网络钓鱼网站,这些网站会窃取个人信息,并用恶意软件感染访问者。
多因素身份验证可用于减轻人为错误,例如在登录时需要额外的身份识别方式。这可以通过向手机发送电子邮件或短信来完成,这些终端已由用户事先设置。
单个薄弱环节会危及整个系统。有线局域网电缆可能会被窃听,WiFi容易被窃听,在互联网上,中间人(MITM)攻击可以劫持流量。流氓网站可能会用恶意软件感染客户端,例如拒绝服务机器人,屏幕抓取器和键盘记录器可以记录个人、信用卡和健康数据。
本文重点关注如何避免可在网页中解决的“通过网络传输”的安全问题。但是计算机安全在互联网上绝对是必要的,因此计算机必须使用杀毒软件,例如来自http://free.avg.com/us-en/free-antivirus-download的免费AVG软件,如以下截图所示
浏览器是访问互联网的标准方式,而JavaScript是事实上的浏览器编程语言。因此,与某些说法相反,互联网安全**_必须_**包括JavaScript,事实上W3C一直在开发Web加密API。
首先,确定所需的安全级别以及信息的保密性。这可以从最低限度地使用互联网咖啡馆和复印店的不安全第三方计算机和互联网连接,到使用虚拟专用网络(VPN),以及使用仅在受生物识别安全措施(例如虹膜扫描仪或钥匙卡)保护的区域可访问的安全、物理保护的硬件。
在互联网上,客户端基于浏览器的传输信息加密提高了安全性,而无需依赖服务器、连接或证书颁发机构(CA)的安全性,所有这些都越来越容易受到攻击。根据2014年11月的McAfee Labs威胁报告,使用证书使恶意软件显示为合法软件的情况在2012年至2015年期间增长了700%。
为了保护用户名和密码免受浏览器中键盘记录器窥探,可以使用鼠标激活的屏幕图形键盘,但使用这些时要防范鼠标事件和位置跟踪器。在服务器上,密码相关数据和个人身份信息的存储应加密。
历史上,基本的“通过网络传输”安全是通过安全套接字层(SSL)软件实现的,该软件运行在用于通过网络传输和路由数据的TCP/IP协议之上。使用对称密钥算法 - DES(数据加密标准) - 加密数据。SSL在HTTP和IMAP等更高级别协议之下工作,并加密和解密通过http发送的数据。但这种在http上使用SSL的“https”协议不再安全,因为现成的软件可以解码https流量。
SSL现已被传输层安全(TLS)取代。到1990年代后期,DES也不再安全,美国国家标准与技术研究院(NIST)举行了一场竞赛,以寻找DES的替代品。结果,Rijndael对称分组密码算法被选为新的高级加密标准(AES)。
保护数据传输
数据泄露已导致数千万条记录被泄露。超过2000万条包含个人身份信息(PII)的记录从美国人事管理办公室(OPM)被盗,医疗服务提供商Premera和Anthem(分别为1100万和8000万)的记录遭到泄露,IRS也遭到黑客攻击。在此之前,Albertson's和Target商店的大规模数据泄露也显示了互联网上未受保护的PII的脆弱性。
这些攻击强调了组织对其受托数据进行加密的必要性,因为OPM、Target和Anthem的泄露事件都可以追溯到因人为错误而泄露的凭据。但安全技术供应商也容易受到攻击,例如反恶意软件安全公司卡巴斯基实验室的黑客攻击,该攻击与Stuxnet对伊朗的攻击有相似之处,后者摧毁了用于铀浓缩的离心机。
计算机安全有多个方面,包括使用虹膜扫描等技术进行安全的基于硬件的登录,以及避免使用Adobe Flash等易受攻击的软件。还应采用双模式身份验证,在输入用户名和密码后,使用额外信息确认用户身份。例如,要求用户提供“母亲的娘家姓”,但该特定信息不安全,因为可能易于获取。
可以使用单独的连接通道进行双模式登录身份验证。Web服务器可以呼叫智能手机并提供代码、要回答的问题或要输入的数据,或者可以采用额外的基于硬件的登录方法,例如生物识别虹膜扫描或指纹。
过去,安全的客户端-服务器互联网连接使用SSL https协议调用网页。但这种方法不再安全,因为SSL使用易受攻击的传统加密技术,已被传输层安全(TLS)取代。NIST在http://nvlpubs.nist.gov/nistpubs/SpecialPublications/NIST.SP.800-52r1.pdf的2014年5月第800-52修订版1号特别出版物中如此描述TLS:
“虽然SSL 3.0是SSL协议版本中最安全的,但由于它部分依赖于使用未经批准的加密算法,因此不批准用于保护联邦信息。TLS版本1.1和1.2在正确配置时被批准用于保护联邦信息。TLS版本1.0仅在与非政府系统互操作性所需且根据这些指南配置时才被批准。”
通过https访问http页面的网页不安全——请参阅**https://wikibooks.cn/wiki/Web_Application_Security_Guide/Insecure_data_transfer**。这里关注的是在互联网传输(和存储)之前加密数据,而不是人为安全因素。因此,不要将密码贴在电脑屏幕上的便签上!
安全数据交易的核心有几个要求
- 保密性 - 加密文本使其不可读
- 完整性 - 确保文本防篡改 - 使用消息认证码(MAC)
- 认证 - 内容来自受信任的来源,并且发件人确实发送了消息
- 完美前向保密 - 通过临时、短暂的加密密钥避免未来的泄露
- 可用性 - 确保及时可靠的访问
这些功能的实现程度可能会因性能考虑和法规要求而异。例如,确保如果密钥泄露,它不能用于破解以前传输的文本块或未来传输的块的完美前向保密(PFS),可能会带来15%到27%的性能损失——请参阅http://vincent.bernat.im/en/blog/2011-ssl-perfect-forward-secrecy.html的测试。
安全功能的实现因互联网安全应用程序和供应商而异。可用功能还取决于所使用的服务器和浏览器(及其版本),以及数据是否受联邦信息处理标准(FIPS)约束。
密码学主要有三种类型
- 秘密密钥:加密和解密使用相同的密钥,
- 公钥:免费可用的公钥(通过互联网交换)用于加密信息,私钥用于解密,以及
- 哈希函数:不可逆地加密数据,用于检查消息的有效性。
- 本文介绍的斯坦福JavaScript加密库(SJCL)由斯坦福大学的Emily Stark、Mike Hamburg和Dan Boneh编写。此处描述的椭圆曲线迪菲-赫尔曼(ECDH)密钥协商协议代码由Tom Wu在其斯坦福大学的工作中完成。
在实践中,在以下SJCL示例中使用的共享秘密密钥加密方法可以通过在网页中包含JavaScript库文件“_sjcl-min.js_”来使用。此文件位于www.web2ria.com/widgets.zip。
在网页中(例如登录页面)使用SJCL库的客户端JavaScript代码可能如下所示:
发件人 - sjcl.encrypt(‘secretSharedKey’, ‘plainTextToEncrypt’)
AND
收件人 - sjcl.decrypt(‘secretSharedKey’, ‘cipherTextToDecrypt’)
这要求发件人和收件人安全地存储“secretShared Key”,该密钥可以而且应该与用户的密码不同。可以使用零知识方法(例如椭圆曲线迪菲-赫尔曼(ECDH)用于加密密钥,或安全远程密码(SRP)协议用于密码)交换秘密值。
在更一般的情况下,发送方和接收方或客户端和服务器之间的TLS安全通信会话可能如下进行:
- 客户端打开会话并检查服务器身份,例如X.509公钥证书
- 服务器检查客户端身份
- 建立最安全的双方支持的加密套件
- 使用服务器公钥交换非对称编码的加密设置信息,包括临时、短暂对称编码的设置信息
- 完成非对称加密设置信息交换后,切换到对称加密,然后发送消息正文
- 消息发送后,丢弃临时密钥并关闭会话
- 服务器检查完整性并解密消息
交换信息的双方使用非对称加密进行初始握手,使用服务器的公钥和私钥。这允许对客户端、服务器进行身份验证,并交换加密参数。
但非对称加密比对称加密慢几个数量级。因此,在初始非对称握手之后,实际消息是对称加密和解密的。
为了加密纯文本消息,将其分成等长的块,并且对于某些加密方法,如果需要将其填充到标准长度,则填充最后一个块。PKCS7填充是完整的字节,每个填充字节的值是添加的字节数,例如,3字节填充将由03 03 03组成。因此,例如,在需要4字节填充的最后一个消息块中,最后一个块可能如下所示:
... | DD DD DD DD DD DD DD DD | DD DD DD DD 04 04 04 04 |
如果最后一个消息块是一个完整的块,并且不需要填充,则会添加一个虚拟的“填充”块,每个字节都设置为完整的块长度,以便解密软件不会删除实际消息的最后一个块的一部分,误以为是填充。
SJCL库支持这种加密类型和其他几种类型,例如ECC(椭圆曲线密码学)和SRP,后者在用户登录时无需通过互联网传输密码即可验证用户密码。客户端和服务器可能只是两个设备,例如计算机和智能手机、浏览器和Web服务器,或者它们可能是点对点消息应用程序。一方请求,另一方接受会话,使用SRP,用户的密码不会因传输而面临风险。一旦密码经过验证,就会派生一个临时的、一次性加密密钥,并使用其哈希值来加密和解密内容。双方在两个设备/方之间就特定浏览器/客户端和服务器协商一致支持的加密套件。
以下截图中的每一行都显示了所用浏览器中可用的受支持密码套件,按偏好从最安全到最不安全的顺序排列。截图中显示的报告包含以下项目:
密钥交换 - 大容量加密和密钥大小 - MAC和密钥大小
其中MAC是附加到消息末尾的消息认证码标签。MAC也用于确保文件系统的完整性。
截图中第一行“DHE-RSA-AES256-SHA256”描述了带有PFS的TLS 1.2密码套件,它使用DHE(Diffie-Hellman Ephemeral)密钥交换算法、RSA认证、AES256消息加密(256位密钥)以及SHA256(安全哈希算法)伪随机函数(PRF)哈希函数(256位MAC,由较短的随机数作为种子(或加盐))。
DHE密钥交换协议允许两方在不安全的公共信道上建立一个共享的临时秘密密钥,用于交换加密设置信息,从而确保PFS。第三方不可能发现秘密,因为在现有技术下(截至2018年),密钥无法在合理的时间内计算出来。
AES使用Rijndael对称分组密码算法,密钥长度为128、192或256位,输入和输出文本的固定数据块大小均为128位。椭圆曲线迪菲-赫尔曼(ECDH)使用椭圆曲线计算比RSA更短、更安全的密钥——一个512位的ECDH密钥大约相当于一个15,360位的RSA密钥。
椭圆曲线具有以下特性:在曲线上添加两个点P和Q,会生成曲线上第三个点R。两个通信方从NIST定义的曲线列表中选择一个公共椭圆曲线C,以及C上的一个公共点Q。点Q计算为起始点P的倍数,Q = nP。攻击者可能知道P和Q,但找到整数n是一个难题。Q(即nP)是公钥,n是私钥。
使用ECDH时,使用椭圆曲线上的点而不是标准迪菲-赫尔曼中使用的大的随机素数(N)。因此,mod(N)计算被椭圆曲线值取代。
迪菲-赫尔曼密钥交换
在迪菲-赫尔曼密钥交换中,双方各自使用不同的秘密随机数(私钥)x和y,并且每一方都传输公钥(P)的私钥x或y次方的值。因此,公开的数据仅限于Px和Py的值。发送方生成一个随机的48字节预主密钥,用接收方的公钥加密,并将加密的预主密钥发送给接收方。接收方用其私钥解密,并用它创建一个共享主密钥。
所使用的随机数生成器必须具有足够的“熵”或随机变异性,以提供足够的随机性以实现安全加密,而JavaScript Math.random()
函数**_不_**提供此功能。诸如用户随机鼠标移动之类的物理过程可用于生成随机的x和y值,且时间范围足够长,例如30秒。
网络服务可以提供随机数,例如http://www.unit-conversion.info/texttools/random-string-generator/,它可以按需生成可下载的随机数和字符串。另一个网站www.fusionbox.com/mouseware/使用鼠标移动来实现随机化。SJCL库也包含随机数生成器。
因此,一方知道x和Py的值,另一方知道y和Px的值,所以双方都可以计算共享密钥P(x*y),因为(Py)x = P(x*y)且(Px)y = P(x*y)。因此,只要x和y保持秘密,窃听者只能知道Px和Py的值,而无法计算共享密钥。并且,如果x和y都是临时、短暂的值,则共享密钥也是临时和短暂的。
迪菲-赫尔曼用于发送非对称加密的共享秘密密钥,然后发送的消息使用共享秘密密钥的哈希值进行对称加密。密码被哈希并与存储的哈希值进行比较,它们可以在哈希之前与随机的、非秘密的盐值和/或用户名进行连接。例如,Hash(Salt + Password + UserName),或者更好的是Hash(Salt + Hash(Password + User Name))。基于哈希的消息认证码(HMAC)使用附加到被哈希数据末尾的共享秘密,并在TLS中使用。
为了对不同的消息进行哈希处理,独特的盐值会与密码连接在一起,这样就可以避免存储预计算的密码值哈希表并将其用于破解密码哈希。无论使用何种值组合进行哈希处理,所使用的组合都必须在最初由双方达成一致。
因此,如果密码P是“abc”,或者十六进制61 62 63,并且随机选择一个8字节的盐S,“78 57 8E 5A 5D 63 CB 06”,则连接值P+S,写为P | S,是“61 62 63 78 57 8E 5A 5D 63 CB 06”。这通过使用基于密码的密钥派生函数2(PBKDF2)方法重复哈希数千次来加强。
斯坦福SRP演示使用Hash(salt | Hash(UserName | ':' | Password)),并重复哈希数千次,以增加运行暴力攻击所需的时间。用户名和密码之间的冒号(:)使每对都独一无二,并避免了将用户名“timSmith”和密码“oldman”与“timSmit”和“holdman”哈希成相同的值。如果没有“:”,两者都将是字符串timSmitholdman,而有“:”时将是timeSmith:oldman和timSmit:holdman。
使用迪菲-赫尔曼的双方商定一个大素数“N”和一个相对于N原始的较小数“g”。g相对于N原始意味着可以找到整数“k”,其中对于i从1到N-1的**_所有_**值,(k = gi mod N)。因此,如果k的不同值也等于从1到N-1的所有整数,则g相对于N原始。
模“A mod B”是第一个值A除以第二个值B的余数。对于公式(gi mod N)中N = 7和g = 2,i = 1到i = (N-1),即i = 1到i = 6,得到k值的集合是:
i N k
21 mod 7 = 2 { 2 / 7 = 0 + 2
22 mod 7 = 4 { 4 / 7 = 0 + 4)
23 mod 7 = 1 { 8 / 7 = (1 x 7) + 1
24 mod 7 = 2 { 16 / 7 = (2 x 7) + 2
25 mod 7 = 4 { 32 / 7 = (4 x 7) + 4
26 mod 7 = 1 { 64 / 7 = (9 x 7) + 1
这组k值(2,4,1,2,4和1)不包括从1到6的所有整数。因此g = 2对N = 7**_不是_**原根。但是如果N = 7和g = 3,对于i = 1到i = 6的k值是:
i N k
31 mod 7 = 3 { 3 / 7 = 0 + 3
32 mod 7 = 2 { 9 / 7 = (1 x 7) + 2
33 mod 7 = 6 { 27 / 7 = (3 x 7) + 6
34 mod 7 = 4 { 81 / 7 = (11 x 7 )+ 4
35 mod 7 = 5 { 243 / 7 = (34 x 7) + 5
36 mod 7 = 1 { 729 / 7 = (104 x 7) + 1
这一次,由(gi mod N)计算出的N从1到(N-1)的所有整数,对于i从1到(N-1),即3,2,6,4,5和1都匹配,所以3是7的原语。在实际使用中,N是一个大素数,任何一方都可以选择N和g,然后通过正常的未加密通道(如互联网)告诉对方所选的值,因为它们不是秘密。
哈希函数是单向的,因此从哈希值中推导出原始字符串极其困难。将加密消息的已知和预期哈希值与新计算的哈希值进行比较,以确保其有效性,即未被篡改,并且来自可信来源。
因此,如果用户从英语中大约100,000个单词中选择密码,则要破解一个哈希密码,必须尝试多达100,000个哈希值。但是通过获取密码并添加32位盐,可能的密码数量乘以盐的数量,如下所示:
密码可能性 = 100,000
盐可能性 = 232 (32位 )
所需哈希计算 = 密码可能性 * 盐可能性
所需哈希计算 = 100,000 * 232
所需哈希计算 = 429,496,729,600,000
加盐字符串以这种方式加强,以抵御使用预计算的“彩虹”表反转加密哈希函数的攻击。
在CBC(密码块链)中,每个编码文本块的内容都依赖于先前的源文本块。因此,相同的独立明文块永远不会以相同的方式加密,并且由于在第一个块之前没有数据,因此需要一个随机的初始化向量(IV)来对其进行编码。IV绝不应重复使用 - 每次发送消息时随机生成新的IV可确保即使是相同的消息也会以不同的方式编码。
对附加到消息末尾的标签进行完整性检查,以确保其未被篡改。并且需要一个共享密钥,因为完整性检查不能确保保密性。
不应应用压缩,因为它容易被黑客攻击,因为压缩用更小的标记替换重复的字符字符串。这使得攻击者可以通过查看截获消息插入不同字符时压缩消息长度如何变化或不变来猜测内容。
有关密码学的更详细解释,请参阅www.garykessler.net/library/crypto.html#dhmath。
使用SJCL网页
斯坦福JavaScript加密库(SJCL)可在http://bitwiseshiftleft.github.io/sjcl/demo/以及通过点击www.web2ria.com上的“网络安全”选项卡,“SJCL网页”子菜单项找到。它演示了本章描述的功能——请参阅以下截图。
要使用SJCL,您可以使用默认的明文,或者在中间列的“Plaintext”框中输入文本,在左侧列的“Password”框中输入密码。默认情况下,使用CCM密码模式(CCM是带有CBC-MAC的计数器模式,CBC-MAC是密码块链消息认证码),默认密钥大小为128位,每次输入新密码时,加强因子为1000。默认情况下,每次发送消息时都会使用新的随机IV。
单击红色“加密”向下箭头发送加密消息。然后从其框中删除明文消息,并将加密消息放入“密文”框中。
使用默认设置,头字段会放入“密文”框中,如果接收方有此数据,则无需。点击蓝色“解密”向上箭头会反转此过程。
在默认设置下,每次用相同的密码重新发送相同的消息都会生成新的IV,因此即使是相同的消息,密文也是唯一的。密码加强会减慢计算速度,但范围在500到2500之间可以产生可接受的结果,且延迟最小。
在默认设置下,当密码更改时,每次发送消息时都会生成新的随机盐和密钥,并且每次发送消息时都会生成新的随机IV。密钥由密码、盐和加强因子计算得出,其大小可以是128、192或256位,或者可以手动输入密钥。
在演示中,选择的密码模式可以是CCM或OCB2(偏移量密码本模式)。OCB2比CCM更紧凑,速度更快一些,但由于它已获得专利,其使用比CCM更受限制,两种密码模式都使用AES加密。除了消息中包含的固定长度加密认证标签外,还可以将可选的“adata”(认证数据)添加到头部。然后返回的文本块可能如下所示:
{
"iv":"36+jK53EnbPbHssuWa1JCw==",
"v":1,
"iter":1000,
"ks":256,
"ts":128,
"mode":"ccm",
"adata":" Authentication%20Text",
"cipher":"aes",
"salt":"9+Va5voDXEA=",
"ct":"4h1AT/ZCbs9Y9ahmnquGtumvXT/1EJmQnFuh8AYleU4zscriK5AzgQjfypSmgOgw2DrM3Q=="
}
这里,“iv
”是初始化向量,“v
”是版本号,“iter
”是密码强化因子,“ks
”是密钥大小(比特),“ts
”是认证标签大小(比特),“mode
”是密码模式,“adata
”是认证数据字符串(例如,可能是限制重复登录尝试的时间戳),“cipher
”是使用的加密算法,“salt
”是密码盐,“ct
”是密文。
要在实际加密信息交换中使用SJCL应用程序,例如发送和接收电子邮件或文件加密,请在页面上选择所需的参数。然后输入共享秘密密码或密钥,将电子邮件消息或文件内容复制到“明文”框中,然后单击“加密”箭头。
为了避免邮件系统在您输入时自动保存未加密消息副本的问题,请在纯文本编辑器中撰写消息,而不是在电子邮件消息框中。然后复制并粘贴所有加密文本,包括初始化向量、左右大括号,并将加密消息通过电子邮件发送给收件人,或保存到文件中。
在接收端,将加密消息或文件内容复制到“密文”框中,并使用共享密码或密钥解密。例如,以下显示了www.web2ria.com上“vitalSigns.csv”文件的内容。为了便于阅读,未加密文件第一行中的列标题在此处折叠:
Age,
Record Date<br>mm/dd/yyyy,
Blood Pressure<br>
mmMg,
Cholesterol<br> mg/dL,BMI<br>,
Height<br> Ft-ins,
Weight<br> lbs,
Temp <br> ° F,
Pulse<br> bpm,
Respiration<br>breaths/min,Blood<br>
O<sub>2</sub><br> %,
Blood Sugar<br> mg/dL
4,09-24-1936,120 / 80,190,25.7,3-2, 50, 98.6, 90, 16, 97, 60
42,09-24-1974,120 / 80,190,25.7,6-2,200, 98.6, 70, 16, 97, 70
43,12-25-1975,130 / 85,200,25.7,6-2,200, 98.3, 75, 15, 96, 80
44,10-20-1976,140 / 90,210,25.7,6-2,200, 97.8, 80, 14, 96, 90
45,12-10-1977,145 / 95,220,25.7,6-2,200, 98.2, 85, 13, 95,100
46,11-07-1978,150 / 98,230,25.7,6-2,200, 99.1, 90, 12, 95,110
47,10-04-1979,155 /100,240,25.7,6-2,200,101.6, 95, 11, 94,120
48,08-22-1980,160 /105,250,25.7,6-2,200, 99.3,100, 10, 94,130
49,05-20-1981,165 /107,260,25.7,6-2,200, 98.6,105, 9, 93,140
50,03-12-1982,170 /110,270,25.7,6-2,200, 97.4,110, 10, 93,150
51,11-02-1983,175 /112,280,25.7,6-2,200, 96.3,120, 11, 92,160
52,07-28-1984,178 /115,290,25.7,6-2,200, 97.9,130, 12, 90,170
53,07-16-1985,174 /110,300,25.7,6-2,200, 98.1,140, 13, 89,180
54,10-03-1986,170 /105,280,25.7,6-2,200, 98.3,150, 14, 88,160
55,08-02-1987,160 /100,260,25.7,6-2,200, 99.0,160, 15, 87,140
56,06-05-1988,150 / 95,240,25.7,6-2,200, 98.8,170, 16, 88,120
57,03-01-1989,140 / 90,220,25.7,6-2,200, 98.7,150, 17, 89,100
58,02-26-1990,120 / 80,200,25.7,6-2,200, 98.6,130, 18, 90, 80
109,12-25-2010,140 /100,190,25.7,5-1,170,101.3,110,100,100,100
当发件人使用密码“http://www.web2ria.com”加密时,使用SJCL默认设置的结果如下,为了便于阅读,将单行密文(ct)拆分为多行:
{
"iv":"HV9Xro6SvCgq17ReXAsn4Q==",
"v":1,
"iter":1000,
"ks":128,
"ts":64,
"mode":"ccm",
"adata":"",
"cipher":"aes",
"salt":"ObpiMz7YLFw=",
"ct":"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" }
然后,接收方可以将此文本块(即加密文件的内容)插入“密文”框,输入密码,然后单击浅蓝色“解密”向上箭头以获取原始明文。
原始文本文件位于www.web2ria.com/vitalSigns.csv,加密文件位于http://www.web2ria.com/vitalSigns.txt。
当然,这对于某些用户来说可能有点麻烦,并且有各种软件可以减轻加密的负担,从加密的Windows文件系统和电子邮件程序,到在线、基于网络的加密电子邮件,例如HushMail(www.hushmail.com/signup)。
此截图显示了构成SJCL核心的文件
在“www.web2ria.com”->“网络安全”选项卡->“SJCL网页”子菜单项的SJCL演示页面中使用的“sjcl-min.js”小型化JavaScript文件,由上面截图中“core”子目录中的文件连接而成,然后进行小型化。此小型化文件以及未小型化的核心文件包含在可从www.web2ria.com/widgets.zip下载的widgets.zip文件中。
此截图中显示的最后一个文件是用于密钥交换的_srp.js_安全远程密码实现,其他文件(例如_ecc.js_)启用了椭圆曲线密码学。
椭圆曲线迪菲-赫尔曼(ECDH)
椭圆曲线迪菲-赫尔曼(ECDH)网页可在http://www.web2ria.com,“网络安全”选项卡,“ECDH”子菜单项中查看和试用,并显示为下一张截图所示。
在ECDH中,椭圆曲线点用于提供用于加密内容的公私加密密钥对,而不是标准迪菲-赫尔曼中使用的整数,预定义的参数包括N和g,适用于任何商定的椭圆曲线。双方生成其私钥和公钥并交换公钥,然后各自将其私钥乘以对方的公钥以获得共同的共享秘密密钥。
派生点在曲线上的X坐标用作共享秘密密钥,如果双方已提前对此达成一致(称为“紧凑表示”——参见RFC 6090第4.2节)。要试用ECDH,请转到“网络安全”选项卡中的“ECDH”子菜单项,然后将计算出的共享秘密密钥从“X”(上层秘密密钥)字段复制并粘贴到“SJCL网页”子菜单项的“密钥”字段,然后单击“加密”向下箭头。实际上,此密钥在使用之前会进行哈希处理。
安全远程密码(SRP)
SRP页面加载时,“状态”显示“认证失败..”,因为客户端认证密码未输入任何密码,因此密码或共享秘密“S”均不匹配。通过在“认证协议”区域的“客户端密码”字段中输入匹配密码,并点击任意“随机化”按钮来试用SRP页面。然后“状态”字段将显示“认证成功”。该示例需要浏览器中安装Java,因为它用于获取随机数。
共享秘密“S”匹配,可以复制并粘贴到“SJCL网页”菜单项的“密钥”字段中,然后单击向下“加密”箭头。
SRP-6a 工作原理如下
N Large safe prime (N = 2q+1, where q is a random prime ) { Shared
g Generator modulo N { Shared
k Multiplier, k = H(N | g)
s User / Client's random salt, and different Host / Server’s one
I Username { Shared
P Cleartext Password
H() One-way hash function
u Random scrambling parameter
a, b Secret ephemeral values
A,B Public ephemeral values { Shared
x Private key (derived from P and s)
v Password verifier = g<sup>H(s | P)</sup>
以下是使用前面“迪菲-赫尔曼密钥交换”部分已知值N=7和g=3的简单数学计算的SRP数值证明
- 用户
a = 4 { in practice a large secret random # A = g<sup>a</sup> mod N { A is public and sent to the Host = 3<sup>4</sup> mod 7 = 81 mod 7 { 7 x 11 = 77 A = 4 { 81 – 77 = 4
- 宿主
b = 2 { in practice a large secret random # B = g<sup>b</sup> mod N { B is public and sent to the User = 3<sup>2</sup> mod 7 = 9 mod 7 { 7 x 1 = 7 B = 2 { 9 – 7 = 2
- 用户
S = B<sup>a</sup> mod N { shared secret key, S = 2<sup>4</sup> mod 7 = 16 mod 7 { 7 x 2 = 14 Shared Secret = 2 { 16 – 14 = 2
- 宿主
S = A<sup>b</sup> mod N { shared secret key, S = 4<sup>2</sup> mod 7 = 16 mod 7 { 7 x 2 = 14 Shared Secret = 2 { 16 – 14 = 2
当用户设置帐户时,主机将其用户名I、随机盐s和验证器v保存在其密码数据库中。这样,即使主机数据库被泄露,实际密码也不会被泄露。
x = H(s | P) (salt ‘s’ is chosen randomly )
v = g<sup>x</sup> (compute & store password Verifier )
实际中还使用其他方法进行身份验证,如下所示:
User -> Host: I, A = g<sup>a </sup> ( identify User: send I, A = random # )
Host -> User: s, B = kv + g<sup>b </sup>( send salt & B = random # )
Both: u = H(A | B) (hash concatenation of A & B )
User: x = H(s | P) (User hashes salt & Password )
User: S = (B - kg<sup>x</sup>)<sup> (a + ux)</sup> (User computes session key )
User: K = H(S) (User hashes Session key )
Host: S = (Av<sup>u</sup>) b (Host computes Session key )
Host: K = H(S) (Host hashes Session key )
双方现在都拥有一个共享的、强大的会话密钥K,他们通过显示其密钥匹配来验证身份。为了验证用户是否知道密码,使用基于单向哈希的简化消息认证码(MAC),M1和M2,其两步过程如下:
- 第1步 用户 -> 主机:M1 = H(A | B | KUser) 主机计算并验证M1
- 第2步 主机 -> 用户:M2 = H(A | M1 | KHost) 用户计算并验证M2
双方还采用以下保障措施:
- 如果用户收到B == 0 (mod N) 或 u == 0,则用户中止。
- 如果主机检测到A == 0 (mod N),则主机中止。
- 用户首先显示K的证明——上面步骤1。如果用户的证明无效,主机在步骤2中不会显示自己的K证明,而是中止。
实际上,大安全素数N比前面所示的简单数学证明中使用的单个数字大得多,例如,在SRP图中第一节“参数”中N所用的78位长随机数。
125617018995153554710546479714086468244499594888726646874671447258204721048803
诸如A和B之类的公共值可以通过任何方式交换,例如电子邮件。但由于它们是短暂的,所以方式应该快速且易于重复使用。
RSA
RSA公钥加密(非对称)可用于加密最多为所选密钥(例如1024、2048或4096位)的文本块,但生成4096位RSA公私钥对可能需要半小时。因此,RSA用于加密对称加密消息的密码/密钥,然后将其预置到对称加密消息块之前。
RSA页面可在www.web2ria.com,“网络安全”选项卡,“RSA”子菜单项中查看和试用,并显示为以下截图所示。加密强度通过单选按钮选择。
对于密钥长度超过2048位的RSA公私钥对生成,是一个耗时的过程,可能仍然需要大约半分钟。例如,在2.2 GHz笔记本电脑上生成4096位长的公私钥对大约需要30分钟,如下一张截图所示。
4096位RSA的解密时间也比2048位RSA长约4倍。
而且,由于黑客创建了伪造证书,他们有了可利用的攻击面。此外,生物识别方法存在一个问题,即如果被黑客入侵和窃取,合法所有者无法更改,它们就会变得无法使用——你无法更改指纹和虹膜外观等生物识别标记。
历史
- 2018年8月31日:初始版本