最近在项目进程中遇上了Linux用户验证的问题,想着怎么样通过Linux本地用户进行安全校验,于是去查了些资料。

Linux的密码存储

查阅资料后发现早期的Linux存储在/etc/password文件中,因为/etc/password权限控制较弱,现在已经不使用了,所以我们这里就不讨论这个文件了,较新的Linux发行版,密码都是存储在/etc/shadow文件中,因为/etc/shadow是管理员权限访问,安全性高出许多,我们可以使用命令来查看文件:

$ sudo cat /etc/shadow

以我真实的用户信息(用户名 inmount 密码 123456)为例:

......

inmount:$6$GTAgpXtw/YsqmaOJ$19/NZg8CVbQJB2BZBRFePGJj8f9Zme0s/VjmjdRjxJ9ItePem3h20tyGOk5Ytu5yIWio.0X.kwcsocfgIm2HY.:18211:0:99999:7:::

......

其中的$6$GTAgpXtw/YsqmaOJ$19/NZg8CVbQJB2BZBRFePGJj8f9Zme0s/VjmjdRjxJ9ItePem3h20tyGOk5Ytu5yIWio.0X.kwcsocfgIm2HY.就是用户密码加密后的字符串,$6代表为基于sha512加密运算,$GTAgpXtw/YsqmaOJ则是一串随机密钥。

使用 .Net Core 的进行简单尝试

针对字符串的简单观察后,采用.net core自带的 sha512再加base64尝试,结果计算结果与查询到的字符串天差地别,一度陷入尴尬的境地。

C语言中的密码函数

既然在.Net Core中没有现成的工具,于是就往C语言上靠一靠,于是乎,一个Linux下的密码函数浮出水面:

char * crypt (const char *key,const char * salt);

使用此函数,直接可以生成我们所需的密码。

探索Linux的动态链接库

作为一个长期奋斗在.Net环境中的程序员,想要调用Linux C函数库中的函数,如果放在几年前,那是想想都感觉自己是不是疯了的感觉,不过这.Net Core还是给了我们希望,在翻阅了了Githud上corefx库(也就是.Net Core的框架源代码)后,发现可以通过DllImport来调用Linux的so动态链接库。

于是,一个想法浮现在脑海中,使用C语言编译so动态库->使用.Net Core调用动态库来实现我们想要的功能。

制作so动态链接库

这一块,网上教程很多的,我就不多说了,贴上代码:

library.h

#ifndef CRYPT_LIBRARY_H

#define CRYPT_LIBRARY_H

char *getpassword(const char *key, const char *slat);

#endif //CRYPT_LIBRARY_H

library.c

#include "library.h"

#include

char *getpassword(const char *key, const char *slat) {

return crypt(key, slat);

}

编译so库:

gcc library.c -fPIC -shared -o libcrypt.so -lcrypt

得到了一个Linux下的标准动态连接库libcrypt.so文件。

使用.Net Core调用so文件

这个就更不用说了,直接上代码:

using System;

using System.Runtime.InteropServices;

namespace App {

class Program {

[DllImport("libcrypt.so",

EntryPoint = "getpassword",

CallingConvention = CallingConvention.Cdecl,

CharSet = CharSet.Ansi,

SetLastError = true)]

public static extern IntPtr getpassword(IntPtr key, IntPtr slat);

[DllImport("libcrypt.so",

EntryPoint = "getpassword",

CallingConvention = CallingConvention.Cdecl,

CharSet = CharSet.Ansi,

SetLastError = true)]

public static extern string getpassword(string key, string slat);

static void Main(string[] args) {

Console.WriteLine(getpassword("123456", "$6$GTAgpXtw/YsqmaOJ"));

Console.WriteLine(Marshal.PtrToStringAnsi(getpassword(Marshal.StringToHGlobalAnsi("123456"), Marshal.StringToHGlobalAnsi("$6$GTAgpXtw/YsqmaOJ"))));

}

}

}

代码中根据原函数定义中的字符指针的特点,可以使用字符串或者指针类型两种处理方式,其结果是一样的,下面是运行结果(需要将libcrypt.so文件拷贝到执行目录下,并在Linux环境下运行,在Windows环境下运行会提示错误):

$6$GTAgpXtw/YsqmaOJ$19/NZg8CVbQJB2BZBRFePGJj8f9Zme0s/VjmjdRjxJ9ItePem3h20tyGOk5Ytu5yIWio.0X.kwcsocfgIm2HY.

$6$GTAgpXtw/YsqmaOJ$19/NZg8CVbQJB2BZBRFePGJj8f9Zme0s/VjmjdRjxJ9ItePem3h20tyGOk5Ytu5yIWio.0X.kwcsocfgIm2HY.

吹一波.Net Core

通过这次的体验,发现结合C语言.Net Core可以在Linux下做几乎所有事情,之前在了解到.Net Core 3.0只支持Windows窗口化编程的遗憾一扫而空,将GTK(好像Mono有个叫GTK#的东西,估计差不多原理)或者WxWeight一类的,用so形式重新封装一下,感觉开发窗口化程序也不会是什么困难的事情(当然Linux下对窗口化的需求本来就比较低),反正不管怎么样,对.Net Core的未来是越来越有信心了。

linux基于此语言的密码,一次有趣的Linux下.Net Core与C语言的合作开发体验:生成Linux标准的用户密码串...相关推荐

  1. 听说go语言越来越火了?那么请收下这一份go语言书单吧!

    关注公众号[程序员书单]后回复"book"即可领取30+精品免费电子书 ​ Go 是一种简单.小巧.令人愉悦的语言.它也有一些犄角旮旯,但绝大部分是经过精心设计的.它的学习速度令人 ...

  2. 虚拟化服务器查看密码策略,Windows Server 2012 RemoteApp体验-通过RD Web修改用户密码...

    在生产环境进行应用虚拟化部署时,终端用户修改密码是很正常的事件,从早期版到Windows 2008 R2,远程桌面用户修改密码一般有以下4种方法: 1.设置用户下次登陆时须修改密码 2.通过按Ctrl ...

  3. 求10 翻译c语言,求助:谁能帮我翻译下最基础的C语言,我是新手,谢谢了!

    main() { int i,j,p,q,s,n,a[11]={127,3,6,28,54,68,87,105,162,18};/*定义i,j,q,p,s,n和a[11],并对a数组赋值*/ for( ...

  4. linux用户密码管理,Linux_详解Linux中的用户密码管理命令passwd和change,passwd 修改用户密码参数 nbsp - phpStudy...

    详解Linux中的用户密码管理命令passwd和change passwd 修改用户密码 参数 -k 保持未过期身份验证令牌 -l 关闭账号密码.效果相当于usermod -L,只有root才有权使用 ...

  5. 修改linux用户密码(passwd)

    对于初学者来说,如何修改linux用户密码也不是件容易的事,其实非常简单,下面举例说明: (1)修改root用户密码 如果是以root身份登录,修改root密码. 只要输入 passwd 就会出现: ...

  6. linux 账号密码 字段,详解Linux中的用户密码管理命令passwd和change

    passwd 修改用户密码 参数 -k 保持未过期身份验证令牌 -l 关闭账号密码.效果相当于usermod -L,只有root才有权使用此项. -u 恢复账号密码.效果相当于usermod -U,同 ...

  7. Linux:两种非交互修改用户密码的两种方式

    背景说明 在制作docker镜像时,会经常涉及添加用户并给用户设置密码的操作.这样的场景在使用Dockerfile时,不能使用交互方式进行镜像制作,这时候就需要使用非交互的方式添加用户并修改用户密码. ...

  8. root用户密码忘记了,root用户的密码

    忘记root密码怎么办 一.手机忘记密码怎么办: 1.如果手机已经获取root权限的话或者你的手机自带Recovery的话可以通过恢复出厂设置进行还原手机,将密码清除. 第一步,关闭手机,将电池取出然 ...

  9. 任意用户密码重置(六):应答中存在影响后续逻辑的状态参数

    前言 在逻辑漏洞中,任意用户密码重置最为常见,可能出现在新用户注册页面,也可能是用户登录后重置密码的页面,或者用户忘记密码时的密码找回页面,其中,密码找回功能是重灾区.我把日常渗透过程中遇到的案例作了 ...

最新文章

  1. <关于并发框架>Java原生线程池原理及Guava与之的补充
  2. 详解虚函数的实现过程之多重继承(3)
  3. Jquery实现自动生成二级目录
  4. 共轭方式怎么判断_怎样判断共轭双烯
  5. Hive 终于等来了 Flink
  6. 遍历窗体中所有控件的信息
  7. 信息学奥赛一本通 2044:【例5.12】回文字串
  8. 升级http到https
  9. Axure中将不同文件页面合在同一个页面中
  10. A1089. 阶乘计算
  11. SpringBoot法律知识分享问答论坛 lawbbs.liuyanzhao.com
  12. Windows10安装IIS服务器
  13. 微信开发之小程序UI设计规范
  14. python居然能语音控制电脑壁纸切换,只需60行代码
  15. 区间DP例题(持续更新)
  16. WPS无法用Ctrl V进行粘贴,怎么办?
  17. Mybatis-plus深入开发(详解${ew.sqlSegment} 与 ${ew.customSqlSegment})
  18. 是的,各位久等的 Windows 神器已上架
  19. 矢量数据-点,线的生成
  20. 主控芯片,划定MP3素质和档次的核心和大脑

热门文章

  1. css6图层 解锁,OpenLayers 5至6:图层无法渲染
  2. 小程序海外也能做吗?小程序海外主体公司开发的案例
  3. OKR怎么使用比较好?
  4. 通过类名和窗口名查找指定窗口
  5. HTTP协议与TCP/IP协议的关系
  6. 常用的数据结构-散列表
  7. 初始化栈、入栈、出栈、栈空、数制转换函数和主函数,实现1348转换成8进制的功能。
  8. python给空列表赋值_python – 赋值前引用的局部变量’list’
  9. YOLO在升级 | PP-YOLO v2开源致敬YOLOV4携带Tricks又准又快地归来(附论文与源码)...
  10. OpenCV源代码分析——SGBM