经典asp和ASP.NET之间的密码加密/解密

2024-01-13

我有 2 个网站:一个用经典 ASP 编写,另一个用 ASP.NET(1.1 框架)编写。这两个应用程序都使用登录机制来验证基于共享数据库表的用户凭据。到目前为止,密码存储在单向 MD5 哈希中,这意味着如果人们丢失旧密码,则必须为其提供新生成的密码。我现在想更改此设置并使密码可解密。

我发现这个 Rijndael 代码可以与经典 asp 一起使用:http://www.frez.co.uk/freecode.htm#rijndael http://www.frez.co.uk/freecode.htm#rijndael

但我找不到 ASP.NET 的相同解决方案。我尝试了这个,但它给了我经典 asp 和 ASP.NET 代码之间不同的加密和解密结果:

        If Not String.IsNullOrEmpty(TextBox1.Text) And Not String.IsNullOrEmpty(TextBox2.Text) Then

        Dim password = TextBox1.Text
        Dim key = TextBox2.Text

        Dim keyGenerator = New Rfc2898DeriveBytes(key, 8)
        Dim r = New RijndaelManaged

        r.Mode = CipherMode.CBC
        r.Padding = PaddingMode.Zeros
        r.BlockSize = 256
        r.KeySize = 256
        r.FeedbackSize = 256

        r.IV = keyGenerator.GetBytes(CType(r.BlockSize / 8, Integer))
        r.Key = keyGenerator.GetBytes(CType(r.KeySize / 8, Integer))

        Dim transform As ICryptoTransform = r.CreateEncryptor()

        Dim encoded As Byte() = Encoding.ASCII.GetBytes(password)
        Dim target As Byte() = transform.TransformFinalBlock(encoded, 0, encoded.Length)

        TextBox3.Text = Encoding.ASCII.GetString(target)

    End If

我认为我在生成密钥或 iv 时做错了什么,但我找不到解决方案。


Phil Fresle 提供了此代码的 C# 版本,可在此处下载:http://www.frez.co.uk/csharp.aspx http://www.frez.co.uk/csharp.aspx。该实现仍然与经典版本不同,因为它采用初始化向量以及块和密钥大小的参数。

您可以使用此实现来匹配经典版本,如下所示:

// Convert the input values to byte[]'s representing ASCII encoding.
// This is what the classic version does
byte[] dataToEncrypt = ASCIIEncoding.ASCII.GetBytes("Ryno");
byte[] password = ASCIIEncoding.ASCII.GetBytes("Saurus");

// Encrypt the data into an array of types
// Notice the block size is 256 bits and the initialization vector is empty.
byte[] results = Rijndael.EncryptData(
    dataToEncrypt,
    password,
    new byte[] { },  // Initialization vector
    Rijndael.BlockSize.Block256,  // Typically 128 in most implementations
    Rijndael.KeySize.Key256,
    Rijndael.EncryptionMode.ModeEBC 
);

// Convert bytes into a HEX string representation
StringBuilder hex = new StringBuilder(results.Length * 2);
foreach (byte b in results)
    hex.AppendFormat("{0:x2}", b);

// FINAL OUTPUT: This matches output of classic ASP Rijndael encryption
string hexEncodedString= hex.ToString();

大多数默认实现将使用密钥大小128, 192, or 256位。块大小为128位是标准的。尽管某些实现允许 128 位以外的块大小,但更改块大小只会将另一项添加到混合中,从而在尝试在一种实现中加密数据以在另一种实现中正确解密时造成混乱。

希望这有帮助。

Update

Phil 的链接不再可用,因此我创建了 2 个要点:

  • ASP/VB实现:https://gist.github.com/ryno1234/2fc83faff281babea7f8 https://gist.github.com/ryno1234/2fc83faff281babea7f8
  • 使用用于 ASP 互操作的帮助程序类的 C# 实现:https://gist.github.com/ryno1234/ea34415643d109974b6f https://gist.github.com/ryno1234/ea34415643d109974b6f
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

经典asp和ASP.NET之间的密码加密/解密 的相关文章

随机推荐

  • .NET 序列化排序

    我正在尝试使用 XmlSerializer 和继承序列化一些对象 但在排序结果时遇到一些问题 下面是一个与我设置类似的示例 public class SerializableBase XmlElement Order 1 public bo
  • C++ 从 Linux 访问 SQL Server

    我需要用 C 将一些数据从 Linux 写入 SQL Server 数据库 我找到了这个sqlapi com 但我认为 首先必须安装 ODBC 驱动程序并且必须工作 我关注了这个 adminlife net allgemein mssql
  • AVPlayer,播放/暂停状态通知?

    我正在寻找一种方法 以便在发生时准确收到通知AVPlayer开始播放 有 费率 属性 但目前我正在定期检查它NSTimer获取更新 我尝试了 KVO 但显然它不符合 KVO 标准 我知道有events https developer app
  • 使用 jquery 动态生成的列表项上的单击事件

    我有一个动态生成的列表 然后我单击该项目并传递index 到另一个函数 问题是这个列表是动态填充的 当我这样做时我的代码没有响应click事件 但是 如果我在动态填充的元素之外添加几个静态 li 元素到列表中 那么这些静态元素就可以工作 这
  • 未通过 .where() 从云函数获取结果

    我正在使用此代码通过比较从集合中获取数据 eslint disable const functions require firebase functions const admin require firebase admin admin
  • 嵌入 Flash 对象上的 HTML 包装器 div 无法通过 jQuery“点击”

    我一直在尝试按照客户的要求进行操作 一旦客户单击 swf 格式的顶部横幅 就重定向到活动页面 然后重定向到目标页面 您可以在以下位置查看已完成的操作 http ausdcf org http ausdcf org 如果您使用 Firefox
  • 在gnuplot中绘制不同颜色的区域

    我制作了以下脚本来在 gnuplot 中绘制图表 有几个点 每个点都封闭在一定的区域内 我想给每个封闭区域指定颜色 我的脚本如下 set terminal wxt set yrange 0 100 set xrange 0 100 unse
  • 检测我正在哪台计算机上运行 R 脚本

    我正在寻找一个 R 函数来返回正在运行脚本的计算机的标识符 或者至少区分两台已知计算机中的一台 我有两台 PC 均运行 Windows 和 RStudio 我通过 VPN 使用办公室的台式机和笔记本电脑 通常处理相同的项目 并且始终使用 R
  • 是否可以等到其他线程处理发布到它的输入消息?

    我想可靠地模拟用户输入到其他窗口 我用SendInput为此 但我需要等到目标应用程序处理输入后再发送更多内容 据我所知 SendInput尽管它的名字如此 但它实际上将消息发布到队列中 并且不会等到它们被处理 我的尝试是基于等待消息队列至
  • jQuery:使用退出按钮退出全屏模式时如何执行代码?

    以下问题 使用我的代码 我通过单击列表中的图像进入全屏模式 我通过 jQuery 将下一个按钮和上一个按钮移动到屏幕边缘 但离开全屏模式后 我希望它们回到原来的位置 但是如何检测全屏模式是否被取消呢 这是我的代码 HTML div span
  • C++ 标准是否保证“a”“b”合并为“ab”? [复制]

    这个问题在这里已经有答案了 下面的代码是cpp标准吗 我以前见过它并且效果很好 但是 我不确定这个标准是否已经存在 include
  • 增强 java.util.Date 类时,cglib 抛出 IllegalArgumentException

    我正在努力增强java util Date与cglib 它不起作用 而且我对 cglib 没有经验 所以我想知道出了什么问题 例如 下面的代码增强了ArrayList works Test public void enhance Array
  • 合并 data.frame 但只保留唯一的列?

    假设我想合并两个 data frames 但有些列是多余的 相同 我如何合并这些 data frames 但删除冗余列 X1 data frame id c a b c same c 1 2 3 different1 c 4 5 6 X2
  • GoogleMock:如何精确预期具有特定参数的一次调用,并查看失败诊断?

    也许是一个技巧问题 我的问题是 如果我写 EXPECT CALL mock handleMessage Times 0 expectation 1 EXPECT CALL mock handleMessage Pointee IsLike
  • 在 opencv 中索引矩阵的最佳方法

    可以说 A and B是相同大小的矩阵 在Matlab 我可以使用简单的索引 如下所示 idx A gt 0 B idx 0 我怎样才能做到这一点OpenCV 我应该只使用 for i 0 rows for j 0 cols if A at
  • R:如何在数据帧内进行偏移和匹配?

    我想使用类似于Excel的OFFSET和MATCH函数的东西 这里是一个示例数据集 数据 Which Test Test1 Test2 Test3 RESULT Test1 TRUE 80 0 Test2 FALSE 25 0 Test1
  • Java继承中的“this”关键字如何工作?

    在下面的代码片段中 结果确实令人困惑 public class TestInheritance public static void main String args new Son Father father new Son System
  • 事件的 Google Analytics 屏幕名称

    我对 Google Analytics 中的 屏幕名称 维度感到困惑 如果您转到 行为 gt 事件 gt 屏幕 您就会看到它 我想知道如何将屏幕名称附加到事件中 目前我正在跟踪屏幕浏览 点击 和事件 点击 我认为分析可以通过查看最后一个屏幕
  • 从 MySQL 中的表的一部分中选择最小值和最大值

    如果我想从整个表中选择最小值和最大值 我可以使用 SELECT min price as min price max price as max price FROM prices 但是如何从表的一部分中选择最小值和最大值呢 例如 我的表中有
  • 经典asp和ASP.NET之间的密码加密/解密

    我有 2 个网站 一个用经典 ASP 编写 另一个用 ASP NET 1 1 框架 编写 这两个应用程序都使用登录机制来验证基于共享数据库表的用户凭据 到目前为止 密码存储在单向 MD5 哈希中 这意味着如果人们丢失旧密码 则必须为其提供新