使用Linux的MD5 API

使用LinuxMD5 API

最近项目中需要用到 md5校验。学习一下openssl中的 md5的API,感觉使用很方便,记上来,以做备忘之需。

openssl/ md5.h:

[code]#define MD5_DIGEST_LENGTH 16

typedef struct MD5state_st
        {
         MD5_LONG A,B,C,D;
         MD5_LONG Nl,Nh;
         MD5_LONG data[ MD5_LBLOCK];
        unsigned int num;
        } MD5_CTX;

int MD5_Init( MD5_CTX *c);
int MD5_Update( MD5_CTX *c, const void *data, size_t len);
int MD5_Final(unsigned char *md, MD5_CTX *c);[/code]

需要用到的接口主要就是这些了。

struct MD5state_st是 md5算法要用到的ctx结构
MD5_Init 是初始化ctx结构
MD5_Update 则是对输入参数data(其长度为len)进行 md5计算。
MD5_Final是最后把结果输出至缓存md中。

OK,先写个程序试一盘:
[code]#include <stdio.h>
#include <string.h>
#include <openssl/ md5.h>

int main(int argc, char **argv)
{
         MD5_CTX ctx;
        unsigned char *buf = "123456789abcdefgh/n";
        unsigned char md[ MD5_DIGEST_LENGTH];
        int i;

         MD5_Init(&ctx);
         MD5_Update(&ctx, (void *)buf, strlen(buf));
         MD5_Final(md, &ctx);

        printf("%s md5: ", buf);
        for(i = 0; i< MD5_DIGEST_LENGTH; i++)
                printf("%02x", md[i]);
        printf("/n");
        return 0;
}[/code]

输出结果看看:
[code][root@Kendo develop]# ./ md5test
123456789abcdefgh
md5: 6bd9796104fdb38fb400f4cb30778190[/code]

没有玩过这个,做了一个文件,将buf的内容放进去。调用openssl来看看:
[code][root@Kendo develop]# openssl md5 md5.conf
MD5( md5.conf)= 6bd9796104fdb38fb400f4cb30778190[/code]
结果一致,应该是正确地。
(Openssl API方便的资料感觉很少,一般偶都是摸着石头过河……)

用到这里了,想看看openssl的 md5程序是如何实现的,至少它展示了如果对一个完整的文件进行 md5校验,并且可以看看偶的API使用得对不对,进入源码目录,打开文件crypto/ md5/ md5.c:
[code]#include <stdio.h>
#include <stdlib.h>
#include <openssl/ md5.h>

#define BUFSIZE 1024*16

void do_fp(FILE *f);
void pt(unsigned char *md);
#if !defined(_OSD_POSIX) && !defined(__DJGPP__)
int read(int, void *, unsigned int);
#endif

int main(int argc, char **argv)
        {
        int i,err=0;
        FILE *IN;

        if (argc == 1)
                {
                do_fp(stdin);
                }
        else
                {
                for (i=1; i<argc; i++)
                        {
                        IN=fopen(argv[i],"r");
                        if (IN == NULL)
                                {
                                perror(argv[i]);
                                err++;
                                continue;
                                }
                        printf(" MD5(%s)= ",argv[i]);
                        do_fp(IN);
                        fclose(IN);
                        }
                }
        exit(err);
        }

void do_fp(FILE *f)
        {
         MD5_CTX c;
        unsigned char md[ MD5_DIGEST_LENGTH];
        int fd;
        int i;
        static unsigned char buf[BUFSIZE];

        fd=fileno(f);
         MD5_Init(&c);
        for (;;)
                {
                i=read(fd,buf,BUFSIZE);
                if (i <= 0) break;
                MD5_Update(&c,buf,(unsigned long)i);
                }
         MD5_Final(&(md[0]),&c);
        pt(md);
        }

void pt(unsigned char *md)
        {
        int i;

        for (i=0; i< MD5_DIGEST_LENGTH; i++)
                printf("%02x",md[i]);
        printf("/n");
        }[/code]

的确是这样使用的,只不过如果是大文件,则是在一个循环中反复调用 MD5_Update来完成的。
  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: 使用 ASP.NET Core 开发一个 web api 程序,具有文件上传和下载接口,且文件接口只能接收后缀名为 md 的文件,可以按照以下步骤进行: 1. 创建 ASP.NET Core 项目 在 Visual Studio 中创建一个新的 ASP.NET Core 项目,并在创建项目时选择 API 模板。 2. 在 Startup 类中配置文件上传服务 在 Startup 类的 ConfigureServices 方法中添加以下代码,以启用文件上传服务: ``` services.AddControllers(); services.AddMvc().AddJsonOptions(options => { options.JsonSerializerOptions.WriteIndented = true; }); services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Title = "My API", Version = "v1" }); }); services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_3_0); ``` 3. 在控制器中实现文件上传和下载功能 在控制器中添加两个 Action,一个用于处理文件上传,另一个用于处理文件下载。 在文件上传 Action 中,使用 [FromForm] 属性来接收文件上传请求。在这个例子中,我们将使用 IFormFile 接口来处理文件上传,如下所示: ``` [HttpPost] public async Task<IActionResult> UploadFile([FromForm]IFormFile file) { if (file == null || file.Length == 0) return Content("file not selected"); // 判断文件后缀是否为 md if (!file.FileName.EndsWith(".md")) return Content("只能上传 md 格式的文件"); // 将文件保存到服务器上 var path = Path.Combine( Directory.GetCurrentDirectory(), " ### 回答2: ASP.NET Core是一种用于开发Web应用程序的跨平台框架,可以在Windows、Linux和macOS上运行。在这个框架下,我们可以轻松地开发一个具有文件上传和下载接口的Web API程序。 首先,我们需要创建一个ASP.NET Core项目。通过使用Visual Studio或者命令行工具,我们可以很容易地创建一个Web API项目。 然后,我们可以添加文件上传和下载接口。对于文件上传接口,我们可以在控制器中创建一个HTTP POST方法,并使用IFormFile类型的参数接收文件。为了确保只能上传后缀名为.md的文件,我们可以使用扩展名验证器来验证上传的文件。 以下是一个用于文件上传的示例代码: ```csharp [HttpPost] [Route("api/upload")] public async Task<IActionResult> Upload(IFormFile file) { // 验证文件扩展名 if (Path.GetExtension(file.FileName) != ".md") { return BadRequest("只能上传.md文件"); } // 保存文件到服务器 var filePath = Path.Combine("uploads", file.FileName); using (var stream = new FileStream(filePath, FileMode.Create)) { await file.CopyToAsync(stream); } return Ok("文件上传成功"); } ``` 对于文件下载接口,我们可以创建一个HTTP GET方法,并添加一个参数来指定要下载的文件名称。同样,我们可以验证文件名称的扩展名,以确保只能下载.md文件。 以下是一个用于文件下载的示例代码: ```csharp [HttpGet] [Route("api/download")] public IActionResult Download(string filename) { // 验证文件扩展名 if (Path.GetExtension(filename) != ".md") { return BadRequest("只能下载.md文件"); } // 返回文件 var filePath = Path.Combine("uploads", filename); var fileStream = new FileStream(filePath, FileMode.Open); return File(fileStream, "application/octet-stream", filename); } ``` 通过这样的编写,我们就可以使用ASP.NET Core开发一个具有文件上传和下载接口的Web API程序,并且只允许上传和下载后缀名为.md的文件。注意,这只是一个简单的示例,实际应用中可能需要添加更多的验证和安全性措施。 ### 回答3: 使用ASP.NET Core开发一个Web API程序时,可以通过以下步骤实现文件上传和下载接口,并限制文件类型为后缀名为.md的文件。 首先,在ASP.NET Core项目中创建一个控制器,该控制器用于处理文件上传和下载的请求。可以命名为FileController。 在FileController中创建一个HttpPost方法来处理文件上传请求。可以使用IFormFile类型的参数来接收上传的文件,并使用[FromForm]特性将文件绑定到该参数。接收到的文件可以使用流的方式保存到服务器或者通过其他方式进行处理。在保存文件之前,可以获取文件的后缀名,如果后缀名不是.md,则返回相应的错误提示。如果后缀名正确,则将文件保存到指定的位置。 接下来,在FileController中创建一个HttpGet方法来处理文件下载请求。可以使用[FromQuery]特性来接收文件名作为参数。在这个方法中,先判断文件名的后缀名是否为.md,如果不是,则返回相应的错误提示。如果后缀名正确,则可以通过File()方法将文件以流的方式返回给客户端进行下载。 同时,为了能够让其他的控制器或中间件能够访问到文件,可能需要在Startup.cs的ConfigureServices()方法中注册相关服务,并配置文件保存的路径。 最后,通过浏览器或工具发送请求来测试上传和下载接口,确保文件只接收后缀名为.md的文件,并能够成功上传和下载文件。 总结来说,使用ASP.NET Core开发一个具有文件上传和下载接口的Web API程序,可以通过控制器中的方法来处理上传和下载请求,并通过对文件的后缀名进行判断,限制只接收后缀名为.md的文件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值