C语言MD5加密算法的简单调用实现(另附:Java/Python/Shell/Golang方法)
2013-09-09 22:55
1221 查看
1.首先加上一些库:apt-get install openssl libssl-dev libssl-doc libcurl4-openssl-dev
2.实现一个用MD5加密密码的小程序:
编译:
运行:
运行结果:
3.Java方法
假设我们想要对同一个字符串:"add and remove ip whitelist dynamically"进行MD5加密。
4.Python方式
4.1 对字符串计算md5:
4.2 对文件计算md5:
使用以上代码来计算超大文件(大于5GB)的话会出现内存被撑爆的错误:MemoryError,因此需要换一种方式来计算大文件的md5值:
5.Shell方式
5.1 对字符串计算md5:
一条命令即可。
5.2 对文件计算md5:
可见:Linux md5和java md5以及python md5对统一字符串加密结果完全一致的。
6.Golang方式:
package main
import (
"crypto/md5"
"encoding/hex"
"fmt"
"io"
"io/ioutil"
"os"
)
func calc1(path string) string {
file, err := os.Open(path)
md5hash := md5.New()
if err == nil {
io.Copy(md5hash, file)
}
return hex.EncodeToString(md5hash.Sum(nil))
}
func calc2(path string) string {
file, err := os.Open(path)
buf, _ := ioutil.ReadAll(file)//将文件转换成为[]byte
md5hash := md5.New()
if err == nil {
md5hash.Write(buf)
}
return hex.EncodeToString(md5hash.Sum(nil))
}
func main() {
path := "input.file"
res1 := calc1(path)
res2 := calc2(path)
fmt.Println(res1, res2)
}
2.实现一个用MD5加密密码的小程序:
#include<stdio.h> #include<stdlib.h> #include<string.h> #include<openssl/hmac.h> #include<openssl/md5.h> int output(char *p,unsigned char* pwd, int len) { int i; printf("%s",p); for(i=0;i<len;i++) { printf("%x",pwd[i]); } printf("\n"); return 0; } int main(int argc, char *argv[]) { if(argc<2) { fprintf(stderr,"%s <original password><salt password><hash length>\n",argv[0]); return 1; } int i,hashLen; unsigned char *originalPwd; unsigned char *saltPwd; originalPwd = (unsigned char *)malloc(strlen(argv[1])+1);//argv[1]是初始密码 saltPwd = (unsigned char *)malloc(strlen(argv[2])+1); //argv[2]是加盐:是指通过在密码任意固定位置插入特定的字符串,让散列后的结果和使用原始密码的散列结果不相符 strcpy(originalPwd,argv[1]); strcpy(saltPwd,argv[2]); hashLen = atoi(argv[3]); //设置加密密码的长度 unsigned char encryptPwd[hashLen]; printf("Before add salt into the original password:\n"); MD5((unsigned char *)originalPwd,strlen(originalPwd),encryptPwd);//使用MD5算法对密码进行加密(不加盐),并输出加密前后密码 output("Original Password = ",(unsigned char *)originalPwd,strlen(originalPwd)); output("Encrypt Password = ",(unsigned char *)encryptPwd,hashLen); printf("\nAfter add salt into the original password:\n"); memset(encryptPwd,0,sizeof(encryptPwd)); strcat(originalPwd,saltPwd); MD5((unsigned char *)originalPwd,strlen(originalPwd),encryptPwd);//使用MD5算法对密码进行加密(加盐),并输出加密前后密码 output("Original Password = ",(unsigned char *)originalPwd,strlen(originalPwd)); output("Encrypt Password = ",(unsigned char *)encryptPwd,hashLen); return 0; }
编译:
gcc md5test.c -o md5test -lcrypto
运行:
./md5test lebaishi wahaha 13
运行结果:
3.Java方法
假设我们想要对同一个字符串:"add and remove ip whitelist dynamically"进行MD5加密。
import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; public class MD5 { public static void main(String[] args) throws NoSuchAlgorithmException{ String token = getMD5(); System.out.println("token = " + token); } static String getMD5() throws NoSuchAlgorithmException{ String plainText = "add and remove ip whitelist dynamically"; MessageDigest md5 = MessageDigest.getInstance("md5"); byte[] cipherData = md5.digest(plainText.getBytes()); StringBuilder builder = new StringBuilder(); for(byte cipher : cipherData) { String toHexStr = Integer.toHexString(cipher & 0xff); builder.append(toHexStr.length() == 1 ? "0" + toHexStr : toHexStr); } //System.out.println(builder.toString()); return builder.toString(); } }结果:token = 490c4ac2f07fdf3c3699536c398f8404
4.Python方式
4.1 对字符串计算md5:
import hashlib m = hashlib.md5() str = "add and remove ip whitelist dynamically" m.update(str) print m.hexdigest()结果:490c4ac2f07fdf3c3699536c398f8404
4.2 对文件计算md5:
#!/usr/bin/env python import hashlib,os,sys def getFileMD5(filepath): if os.path.isfile(filepath): f = open(filepath,'rb') md5obj = hashlib.md5() md5obj.update(f.read()) hash = md5obj.hexdigest() f.close() return str(hash).lower() return None current_path = os.path.dirname(os.path.realpath(__file__)) file_name = current_path + os.path.sep + "file1" print getFileMD5(file_name)
使用以上代码来计算超大文件(大于5GB)的话会出现内存被撑爆的错误:MemoryError,因此需要换一种方式来计算大文件的md5值:
def getMD5(self,filename): md5_value = hashlib.md5() with open(filename,"rb") as file: while True: data = file.read(2048) if data == "": break md5_value.update(data) return md5_value.hexdigest()
5.Shell方式
5.1 对字符串计算md5:
`echo -n "add and remove ip whitelist dynamically" | md5sum`
一条命令即可。
5.2 对文件计算md5:
md5sum file1 | awk '{print $1}'
可见:Linux md5和java md5以及python md5对统一字符串加密结果完全一致的。
6.Golang方式:
package main
import (
"crypto/md5"
"encoding/hex"
"fmt"
"io"
"io/ioutil"
"os"
)
func calc1(path string) string {
file, err := os.Open(path)
md5hash := md5.New()
if err == nil {
io.Copy(md5hash, file)
}
return hex.EncodeToString(md5hash.Sum(nil))
}
func calc2(path string) string {
file, err := os.Open(path)
buf, _ := ioutil.ReadAll(file)//将文件转换成为[]byte
md5hash := md5.New()
if err == nil {
md5hash.Write(buf)
}
return hex.EncodeToString(md5hash.Sum(nil))
}
func main() {
path := "input.file"
res1 := calc1(path)
res2 := calc2(path)
fmt.Println(res1, res2)
}
相关文章推荐
- 解析如何在C语言中调用shell命令的实现方法【转】
- Java实现调用jython执行python文件的方法
- dwr+maven实现java和js方法互相调用,实现推送, 完整切超简单例子
- 使用jni实现在C语言中调用Java的方法
- 在C语言中调用shell命令的实现方法
- python调用c语言函数的一种简单实现方法
- python调用c语言函数的一种简单实现方法
- 解析如何在C语言中调用shell命令的实现方法
- java 解决调用c语言实现简单HelloWorld函数生成.dll动态链接库的32位dll文件无法在64位机上运行
- python 简单照相机调用系统摄像头实现方法 pygame
- 使用Thrift0.9.1实现跨语言调用Golang、Php、Python、Java
- Java程序中实现调用Python脚本的方法详解
- JAVA中native方法调用C语言实现学习
- 解析如何在C语言中调用shell命令的实现方法
- 用C语言模仿Python函数的一种简单实现方法
- 巧用C#做中间语言 实现Java调用.net DLL的方法
- Python实现远程调用MetaSploit的方法
- JAVA中实现链式操作(方法链)的简单例子
- javabean操作文件正确,但是Jsp调用javabean时文件路径出错问题解决之JavaBean访问本地文件实现路径无关实现方法
- 采用python实现简单QQ单用户机器人的方法