网站搭建实录①:身份验证与 RSA 加密登录

网站搭建实录——建立具有身份验证及功能授权的登录界面

登录界面

  1. 使用 ASP.NET 作为服务器代码,使用 MVC 做服务器代码框架
  2. Program.cs 中需要引入的功能
var builder = WebApplication.CreateBuilder(args);
//添加log
builder.Services.AddHttpLogging();
builder.Logging.AddConsole();
//添加身份验证
builder.Services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
.AddCookie(option =>
{
    option.LoginPath = "/Login";
});
//添加授权权限
builder.Services.AddAuthorization(options =>
{
    options.AddPolicy("RequireAdministratorRole",
        policy => policy.RequireRole("Administrator"));
});
// Add services to the container.
//添加带视图的MVC控制器服务
builder.Services.AddControllersWithViews();

var app = builder.Build();

// Configure the HTTP request pipeline.
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Home/Error");
    // The default HSTS value is 30 days. You may want to change this for production scenarios
    app.UseHsts();
}
app.UseHttpLogging();
//重定向Http到Https
//app.UseHttpsRedirection();
app.UseRouting();
//启用身份验证
app.UseAuthentication();
//启用授权
app.UseAuthorization();
//启用静态资源传输
app.MapStaticAssets();

//引用所有Controller路由
app.MapControllers(); 
//启用/Login作为默认路由
app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Login}/{action=Index}/{id?}")
    .WithStaticAssets();

app.Run();
  1. 其中身份验证和授权是为后续做登录打下基础,静态资源传输是为静态 html 投递做准备。对于 Controller,在使用过程中发现 MapControllerRoute 只会生效他声明过的部分,若要启用所有 Controller,必须带上 MapControllers;而单独使用 MapControllers 又会引发没有默认路由、正常网页访问无法返回正确页面的问题,故这两者均要加上
  2. 网页端 cshtml 制作,可以通过 AI 直接完成 cshtml 部分,只有部分细节需要微调

加密功能

  1. 对于账号在传递和存储的过程中使用 RSA 加密,网页端依旧使用 AI 生成
  2. 加密逻辑(前端 forge 公钥加密)
// 将PEM格式的公钥转换为forge可以理解的格式
var publicKey = forge.pki.publicKeyFromPem(publicKeyPem);

// 使用RSA公钥加密账号
var encryptedAccount = publicKey.encrypt(account, 'RSA-OAEP');
  1. 解密逻辑(后端 BouncyCastle 私钥解密)
// 定义一个私有方法,用于解密数据
private byte[] Decrypt(string encryptedData)
{
    // 将Base64编码的字符串转换为字节数组
    byte[] encryptedBytes = Convert.FromBase64String(encryptedData);

    // 从指定的文件中读取私钥
    // 使用BouncyCastle从PEM文件中读取私钥
    string privateKey = System.IO.File.ReadAllText("G:\\save\\private.pem");
    AsymmetricCipherKeyPair keyPair;
    using (var reader = new StringReader(privateKey))
    {
        // 使用PemReader读取私钥对象
        var pemReader = new PemReader(reader);
        var keyPairObject = pemReader.ReadObject();
        // 检查读取的对象是否为AsymmetricCipherKeyPair类型
        if (keyPairObject is AsymmetricCipherKeyPair keyPairObj)
        {
            keyPair = keyPairObj;
        }
        else
        {
            // 如果不是,则抛出异常
            throw new ArgumentException("Invalid private key format");
        }
    }

    // 从keyPair中提取私钥参数
    var privateKeyParam = (RsaPrivateCrtKeyParameters)keyPair.Private;
    // 创建RSA加密引擎
    var rsaEngine = new RsaEngine();
    // 匹配客户端加密填充模式,创建OAEP编码引擎,使用SHA-1作为哈希函数和掩码生成函数
    var oaepEngine = new OaepEncoding(rsaEngine, new Sha1Digest(), new Sha1Digest(), null);
    // 初始化OAEP编码引擎进行解密操作
    oaepEngine.Init(false, privateKeyParam);
    // 使用OAEP编码引擎解密数据
    byte[] decryptedBytes = oaepEngine.ProcessBlock(encryptedBytes, 0, encryptedBytes.Length);

    // 返回解密后的字节数组
    return decryptedBytes;
}
📥 导出 Markdown