linux基于此语言的密码,一次有趣的Linux下.Net Core与C语言的合作开发体验:生成Linux标准的用户密码串...
最近在项目进程中遇上了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标准的用户密码串...相关推荐
- 听说go语言越来越火了?那么请收下这一份go语言书单吧!
关注公众号[程序员书单]后回复"book"即可领取30+精品免费电子书 Go 是一种简单.小巧.令人愉悦的语言.它也有一些犄角旮旯,但绝大部分是经过精心设计的.它的学习速度令人 ...
- 虚拟化服务器查看密码策略,Windows Server 2012 RemoteApp体验-通过RD Web修改用户密码...
在生产环境进行应用虚拟化部署时,终端用户修改密码是很正常的事件,从早期版到Windows 2008 R2,远程桌面用户修改密码一般有以下4种方法: 1.设置用户下次登陆时须修改密码 2.通过按Ctrl ...
- 求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( ...
- linux用户密码管理,Linux_详解Linux中的用户密码管理命令passwd和change,passwd
修改用户密码参数
nbsp - phpStudy...
详解Linux中的用户密码管理命令passwd和change passwd 修改用户密码 参数 -k 保持未过期身份验证令牌 -l 关闭账号密码.效果相当于usermod -L,只有root才有权使用 ...
- 修改linux用户密码(passwd)
对于初学者来说,如何修改linux用户密码也不是件容易的事,其实非常简单,下面举例说明: (1)修改root用户密码 如果是以root身份登录,修改root密码. 只要输入 passwd 就会出现: ...
- linux 账号密码 字段,详解Linux中的用户密码管理命令passwd和change
passwd 修改用户密码 参数 -k 保持未过期身份验证令牌 -l 关闭账号密码.效果相当于usermod -L,只有root才有权使用此项. -u 恢复账号密码.效果相当于usermod -U,同 ...
- Linux:两种非交互修改用户密码的两种方式
背景说明 在制作docker镜像时,会经常涉及添加用户并给用户设置密码的操作.这样的场景在使用Dockerfile时,不能使用交互方式进行镜像制作,这时候就需要使用非交互的方式添加用户并修改用户密码. ...
- root用户密码忘记了,root用户的密码
忘记root密码怎么办 一.手机忘记密码怎么办: 1.如果手机已经获取root权限的话或者你的手机自带Recovery的话可以通过恢复出厂设置进行还原手机,将密码清除. 第一步,关闭手机,将电池取出然 ...
- 任意用户密码重置(六):应答中存在影响后续逻辑的状态参数
前言 在逻辑漏洞中,任意用户密码重置最为常见,可能出现在新用户注册页面,也可能是用户登录后重置密码的页面,或者用户忘记密码时的密码找回页面,其中,密码找回功能是重灾区.我把日常渗透过程中遇到的案例作了 ...
最新文章
- <关于并发框架>Java原生线程池原理及Guava与之的补充
- 详解虚函数的实现过程之多重继承(3)
- Jquery实现自动生成二级目录
- 共轭方式怎么判断_怎样判断共轭双烯
- Hive 终于等来了 Flink
- 遍历窗体中所有控件的信息
- 信息学奥赛一本通 2044:【例5.12】回文字串
- 升级http到https
- Axure中将不同文件页面合在同一个页面中
- A1089. 阶乘计算
- SpringBoot法律知识分享问答论坛 lawbbs.liuyanzhao.com
- Windows10安装IIS服务器
- 微信开发之小程序UI设计规范
- python居然能语音控制电脑壁纸切换,只需60行代码
- 区间DP例题(持续更新)
- WPS无法用Ctrl V进行粘贴,怎么办?
- Mybatis-plus深入开发(详解${ew.sqlSegment} 与 ${ew.customSqlSegment})
- 是的,各位久等的 Windows 神器已上架
- 矢量数据-点,线的生成
- 主控芯片,划定MP3素质和档次的核心和大脑
热门文章
- css6图层 解锁,OpenLayers 5至6:图层无法渲染
- 小程序海外也能做吗?小程序海外主体公司开发的案例
- OKR怎么使用比较好?
- 通过类名和窗口名查找指定窗口
- HTTP协议与TCP/IP协议的关系
- 常用的数据结构-散列表
- 初始化栈、入栈、出栈、栈空、数制转换函数和主函数,实现1348转换成8进制的功能。
- python给空列表赋值_python – 赋值前引用的局部变量’list’
- YOLO在升级 | PP-YOLO v2开源致敬YOLOV4携带Tricks又准又快地归来(附论文与源码)...
- OpenCV源代码分析——SGBM