65.9K
CodeProject 正在变化。 阅读更多。
Home

Microsoft AJAX 框架的扩展

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.25/5 (7投票s)

2007年7月9日

Ms-PL

3分钟阅读

viewsIcon

56122

downloadIcon

166

提供加密服务,包括数据的安全编码和解码,以及哈希和随机数生成,以及JavaScript原生对象的新方法。

引言

在这里,我介绍一个 JavaScript 库,它使用新类扩展了 Microsoft AJAX Framework。毫无疑问,Microsoft AJAX Framework 非常棒。但是,它没有提供或模拟 .NET Framework 提供的所有类和功能。这就是为什么我决定使用 .NET BCL 提供的一些在 JavaScript 环境中可能很有用的类和方法来扩展 Microsoft AJAX Framework。

目前,该库包括三个文件:Sys.Core.js, Sys.Text.js, 和 Sys.Crypto.js

  • 类似于 .NET 3.5 通过新的 System.Core.dll 提供额外的类,Sys.Core.js 为 JavaScript 原生对象提供额外的方法和一些新类,例如 Sys.Convert
  • Sys.Text.js 包含表示 ASCII、Unicode、UTF-7、UTF-8 和 UTF-32 字符编码的类。这些类对于数据编码或解码以及加密服务很有用。
  • Sys.Crypto.js 提供加密服务,包括数据的安全编码和解码,以及哈希和随机数生成,类似于 .NET Framework 中的 System.Security.Cryptography 命名空间。

在本文中,我将介绍如何使用该库提供的加密服务。

让我们比较 MD5 最新的和流行的实现 - Paul Johnston 在 JavaScript 中的实现,与我们在这个库中的实现进行比较。首先,Johnston 的实现需要字符串作为输入。这意味着什么?这意味着您不能使用任何想要的编码。例如,如果您使用 Johnston 的实现对某个非 ASCII 字符串进行哈希处理,并将其与使用 .NET 广为人知的 FormsAuthentication.HashPasswordForStoringInConfigFile 方法计算的哈希进行比较,您会发现它们不匹配。为什么?因为 HashPasswordForStoringInConfigFile 方法使用 UTF-8,而 Johnston 的实现无法提供。加密算法不应该关心字符串和编码。它应该只处理字节,就像 .NET 的工作方式一样。接下来是性能。Sys.Crypto.MD5CryptoServiceProvider 类的运行速度大约比 Johnston 的快 6 到 8 倍(这在很大程度上取决于浏览器)。

让我们看看如何使用上面提到的类。

使用代码

使用 MD5 算法

var buff = Sys.Text.Encoding.UTF8.getBytes("abc");
var md5 = Sys.Crypto.MD5.create();
var hash = md5.computeHash(buff);

window.alert(Sys.Convert.toBase64String(hash));

与 C# 代码比较

byte[] buff = System.Text.Encoding.UTF8.GetBytes("abc");
MD5 md5 = System.Security.Cryptography.MD5.Create();
byte[] hash = md5.ComputeHash(buff);

Console.WriteLine(System.Convert.ToBase64String(hash));

Sys.Crypto 命名空间为以下算法提供类:MD5、SHA-1、SHA-256、HMAC 和 Rijndael/AES。让我们看看如何使用它们。

SHA1 算法

var buff = Sys.Text.Encoding.UTF8.getBytes("abc");
var sha1= Sys.Crypto.SHA1.create();
var hash = sha1.computeHash(buff);

window.alert(Sys.Convert.toBase64String(hash));

HMAC 算法

var hmac = new Sys.Crypto.HMAC("SHA1");
// currently supported SHA256, SHA1, and MD5

var key = Sys.Text.Encoding.BigEndianUnicode.getBytes("Key to mix");

hmac.set_key(key);
// if key is not provided, a random genereted key will be used


var buffer = Sys.Text.Encoding.BigEndianUnicode.getBytes("Hello World!");
var hash = hmac.computeHash(buffer);

window.alert(Sys.Convert.toBase64String(hash));

AES 算法

var aes = new Sys.Crypto.Aes.create();

// encrypting

var aesEnc = aes.createEncryptor();
var buffer = Sys.Text.Encoding.ASCII.getBytes("Hello World!");
var encrypted = aesEnc.transform(buffer);

window.alert(Sys.Convert.toBase64String(encrypted));

// decrypting

var aesDec = aes.createDecryptor();
var decrypted = aesDec.transform(encrypted);

window.alert(Sys.Text.Encoding.ASCII.getString(decrypted));

Sys.Text 命名空间类现在已根据 Microsoft KB940521 (安全公告 MS07-040) 修复,除了 UTF7Encoding 类,该类将在未来修复或从库中删除。

在这里,我简要介绍了 Sys.Crypto 命名空间。有关此命名空间及其基本和抽象类的完整文档(此处未提及),请参阅附加文件。实际上,目前,Sys.Core.js 中的类没有任何文档。请查看源代码。

在不久的将来,我计划发布 XML (?) 和绘图类。好吧,既然我们有 Silverlight,我想绘图 API 是不需要的。我也对 XML API 不确定,尽管您将为所有浏览器提供相同的 API。

添加了 SHA-256 哈希算法支持。

欢迎并感谢任何反馈、建议、性能改进或批评。

也可在 CodePlex 上获取。

© . All rights reserved.