一、消息摘要算法MD5、SHA-1
目录
一、MD5
1、MD5是什么
2、MD5的特点
3、MD5的问题
4、MD5的应用场景
5、MD5的代码
二、SHA-1
1、SHA-1是什么
2、SHA-1的代码
一、MD51、MD5是什么
MD5,即第五版消息摘要算法。
信息摘要技术亦称作哈希技术或散列技术,而其生成的信息摘要结果则被称作哈希码或散列码。
2、MD5的特点3、MD5的问题
MD5解密网站
MD5具有不可逆性云开·全站体育app登录,因此被认为安全性较高。然而,2004年,山东大学的王小云教授在加州举行的密码学会议上揭露,MD5已被破解。实际上,这并非真正的破解,而是显著提升了反向查询的效率。在当时计算机的计算能力范围内,借助她的技术,短短数小时便能找到与MD5值相对应的原始文本。鉴于MD5存在被强力破解的风险开yun体育app官网网页登录入口,因此它已不再被视为安全的加密算法,在那些对安全性能有较高要求的场景中,我们并不推荐直接采用MD5。
4、MD5的应用场景4.1 对密码加密
MD5可以用来对密码加密,防止密码被窃听。
若某用户的账户名为18666666666,其密码设定为123456,那么在未对密码进行加密的情况下,客户端在注册或登录过程中,将直接以明文形式传输密码kaiyun全站网页版登录,具体传输路径为http://localhost:8080/hw/register|login?username=18666666666&password=123456。在此过程中,若有人截获请求,用户的密码便会暴露无遗;此外,服务器数据库中也以明文形式存储密码。
usernamepassword
18666666666
123456
一旦数据库泄漏,用户的密码就被泄漏了。
若采用MD5算法对密码进行加密处理,那么在客户端进行注册或登录操作时,传输的将是加密后的密文。即便在传输过程中,请求信息被非法截获,用户的密码也不会因此泄露。此外,服务器数据库中存储的密码同样是以密文形式存在。
usernamepassword
18666666666
严禁对加密数据进行篡改,确保信息的安全性,不得擅自更改编码,维护数据完整,不得进行非法修改,保护数据不被非法侵入,不得破坏加密结构,确保信息不被非法泄露。
就算数据库泄漏,用户的密码也不会被泄漏。
攻击者构建了一个名为彩虹表的工具,该工具实质上是一个规模巨大的数据库。此数据库中汇集了众多常见密码及其对应的MD5、SHA-1等加密值。目前,广泛应用的彩虹表记录数据量已达到约90万亿条,所需的硬盘空间更是超过了500TB。彩虹表的存在使得攻击者能够通过遍历的方式逆向查找出与MD5值、SHA-1值等相对应的原始文本。若不幸,你的密码被收录在彩虹表中,那么它极有可能被破解。正因如此,在许多场合,我们输入密码时常常会面临字母、数字、下划线以及大小写等复杂要求,其目的在于尽可能地提升明文密码的复杂程度,以降低其及MD5值、SHA-1值等被收录进彩虹表的风险。
显而易见,单纯采用MD5加密存在安全隐患,然而,我们可以在密码中加入特定的字符串,即所谓的“盐值”,这一做法旨在提升原始密码的复杂性,从而降低其MD5值、SHA-1值等被收录进彩虹表的可能性。
4.2 生成数字签名
MD5可以用来生成数字签名,验证数据是否被篡改。
5、MD5的代码
//
// EncryptUtil.h
//
#import
@interface 加密工具类 : NSObject
/**
* MD5加密,返回32位十六进制小写密文
*
* @param plaintext 明文
*
* @return 密文
*/
提供函数用于从字符串中提取并返回小写MD5加密后的密文,输入参数为明文字符串。
/**
* MD5加密,返回32位十六进制大写密文
*
* @param plaintext 明文
*
* @return 密文
*/
实现从字符串获取大写MD5加密文本的函数接口,参数为待加密的明文字符串。
@end
//
// EncryptUtil.m
//
#import "EncryptUtil.h"
#import
@implementation EncryptUtil
创建一个函数,该函数接受一个明文字符串作为输入,并返回一个字符串,该字符串表示输入字符串的MD5小写加密结果。
// 加密数组(占16个字节)
定义了一个名为resultArray的无符号字符数组,其长度与MD5摘要的长度相等。
// 加密
使用CC_MD5函数对plaintext.UTF8String进行计算,同时传入其长度作为参数,并将结果存储在resultArray数组中。
// 密文
创建一个名为md5Ciphertext的NSMutableString对象,并将其初始化为空字符串。
for (NSInteger i = 0; i < CC_MD5_DIGEST_LENGTH; i++) {
[md5Ciphertext appendFormat:@"x", resultArray[i]]; // x代表十六进制
}
return md5Ciphertext;
}
+ (NSString *)md5UppercaseCiphertextFromString:(NSString *)plaintext {
// 加密数组(占16个字节)
unsigned char resultArray[CC_MD5_DIGEST_LENGTH];
// 加密
CC_MD5(plaintext.UTF8String, (CC_LONG)strlen(plaintext.UTF8String), resultArray);
// 密文
NSMutableString *md5Ciphertext = [NSMutableString string];
for (NSInteger i = 0; i < CC_MD5_DIGEST_LENGTH; i++) {
[md5Ciphertext appendFormat:@"X", resultArray[i]]; // X代表十六进制
}
return md5Ciphertext;
}
@end
二、SHA-11、SHA-1是什么
SHA,即安全哈希算法,涵盖了诸如SHA-1、SHA-256、SHA-512等多种算法。
SHA-1与MD5均源自MD4,故而它们在特性、缺陷及适用范围上具有相似性。不过,SHA-1的输出长度为160位,而MD5的输出仅为128位,160位的数量级远超128位,因此SHA-1在安全性上相对MD5有所提升。然而,SHA-1同样存在被暴力破解的风险。
2、SHA-1的代码
//
// EncryptUtil.h
//
#import
@interface EncryptUtil : NSObject
/**
* SHA-1加密,返回40位十六进制小写密文
*
* @param plaintext 明文
*
* @return 密文
*/
实现从明文字符串生成小写SHA1密文的功能,函数名为sha1LowercaseCiphertextFromString,参数为字符串类型的明文plaintext。
/**
* SHA-1加密,返回40位十六进制大写密文
*
* @param plaintext 明文
*
* @return 密文
*/
定义函数sha1UppercaseCiphertextFromString,该函数接收一个字符串类型的明文plaintext,并返回一个字符串类型的SHA1大写密文。
@end
//
// EncryptUtil.m
//
#import "EncryptUtil.h"
#import
@implementation EncryptUtil
创建一个函数,该函数接受一个明文字符串作为输入参数,并返回一个由小写字母组成的SHA1加密后的密文。
定义字符指针cstr,通过将明文plaintext转换为UTF-8编码的字符串形式来赋值。
创建NSData对象data,通过将cstr中的字节和plaintext的长度作为参数调用NSData的dataWithBytes:length方法。
定义了一个名为digest的uint8_t类型数组,其长度为CC_SHA1_DIGEST_LENGTH。
对data的字节进行SHA1加密,以data的长度作为unsigned int类型的参数,并生成摘要。
创建了一个名为sha1Ciphertext的NSMutableString对象,其容量设置为CC_SHA1_DIGEST_LENGTH的两倍。
for(NSInteger i = 0; i < CC_SHA1_DIGEST_LENGTH; i ++) {
[sha1Ciphertext appendFormat:@"x", digest[I]]; // x代表十六进制
}
return sha1Ciphertext;
}
+ (NSString *)sha1UppercaseCiphertextFromString:(NSString *)plaintext {
const char *cstr = [plaintext cStringUsingEncoding:NSUTF8StringEncoding];
NSData *data = [NSData dataWithBytes:cstr length:plaintext.length];
uint8_t digest[CC_SHA1_DIGEST_LENGTH];
CC_SHA1(data.bytes, (unsigned int)data.length, digest);
NSMutableString *sha1Ciphertext = [NSMutableString stringWithCapacity:CC_SHA1_DIGEST_LENGTH * 2];
for(NSInteger i = 0; i < CC_SHA1_DIGEST_LENGTH; i ++) {
[sha1Ciphertext appendFormat:@"X", digest[I]]; // X代表十六进制
}
return sha1Ciphertext;
}
@end
最后编辑于 :2022.05.09 09:38:00
©著作权归作者所有,转载或内容合作请联系作者

