iOS散列(HASH)算法
程序员文章站
2024-03-22 10:07:10
...
总结一篇常用的加密算法文章。
1、常用加密算法
1.1 哈希(散列)函数
- MD5
- SHA1
- SHA256/512
特点
- 算法公开的
- 对相同的数据加密,得到的结果是一样的
- 对不同的数据进行加密,得到的结果都是定长
MD5: 散列字符串32个字符
SHA1: 散列字符串40个字符
SHA256: 散列字符串64个字符
SHA512: 散列字符串128个字符
- 不能反算的
1.2 对称加密算法
- DES(数据加密标准)
- 3DES
- AES(高级密码标准,美国国家安全局使用的,iOS系统使用的加密方式(钥匙串))
1.3 非对称加密算法
- RSA
1.4 ECB&CBC
-
ECB 电子代码本(Electronic Codebook Book (ECB))
就是将一个数据拆分为多块,然后独立加密。
-
密码分组链接模式(Cipher Block Chaining (CBC))
先将明文切分成若干小段,然后每一小段与初始块或者上一段的密文段进行异或运算后,再与**和向量进行加密。该方法能保证密文的完整性,如果一个数据发生改变,后面所有的数据将会被破坏!
2、MD5
2.1 用途
- 密码加密
用户登录时密码验证。两条原则:
1.在网络上不允许传输用户的明文隐私数据
2.在本地不允许保存用户的明文隐私数据 - 信息摘要,信息”指纹”,是用来做数据识别的(文件防篡改)
- 搜索,关键字识别
- 版权标注
2.2 终端查看MD5值
- 字符串MD5值
echo -n 加密字符串 | openssl md5
或
md5 -s 加密字符串
必须要有-n
参数, -n
就表示不输入回车符,这样才能得到正确的结果
- 文件MD5值
md5 file.dat(文件路径)
2.3 MD5散列计算代码
iOS使用系统MD5提供的方法前需要导入头文件#import <CommonCrypto/CommonCrypto.h>
OC代码:
#pragma mark - 散列函数
- (NSString *)md5String {
const char *str = self.UTF8String;
uint8_t buffer[CC_MD5_DIGEST_LENGTH];
CC_MD5(str, (CC_LONG)strlen(str), buffer);
return [self stringFromBytes:buffer length:CC_MD5_DIGEST_LENGTH];
}
- (NSString *)stringFromBytes:(uint8_t *)bytes length:(int)length {
NSMutableString *strM = [NSMutableString string];
for (int i = 0; i < length; i++) {
[strM appendFormat:@"%02x", bytes[i]];
}
return [strM copy];
}
Swift代码:
extension String {
/// MD5加密
func getMd5() -> String {
let str = self.cString(using: String.Encoding.utf8)
let strLen = CUnsignedInt(self.lengthOfBytes(using: String.Encoding.utf8))
let digestLen = Int(CC_MD5_DIGEST_LENGTH)
let result = UnsafeMutablePointer<CUnsignedChar>.allocate(capacity: digestLen)
CC_MD5(str!, strLen, result)
let hash = NSMutableString()
for i in 0..<digestLen {
hash.appendFormat("%02x", result[i])
}
result.deallocate(capacity: digestLen)
return String(hash)
}
/// MD5加密
var md5: String! {
return self.getMd5()
}
}
3、SHA1 / SHA256 / SHA512
3.1 终端查看SHA函数散列值
- 字符串HSA1值
echo -n "string" | openssl sha -sha1
或
echo -n "string" | openssl sha -sha256
或
echo -n "string" | openssl sha -sha512
- 文件SHA1值
openssl sha -sha1 file.dat(文件路径)
或
openssl sha -sha256 file.dat
或
openssl sha -sha512 file.dat
3.2 SHA函数散列计算代码
SHA1散列代码,OC:
- (NSString *)sha1String {
const char *str = self.UTF8String;
// 修改参数,变换散列计算SHA1、SHA256、SHA512
// uint8_t buffer[CC_SHA256_DIGEST_LENGTH];
// CC_SHA256(str, (CC_LONG)strlen(str), buffer);
uint8_t buffer[CC_SHA1_DIGEST_LENGTH];
CC_SHA1(str, (CC_LONG)strlen(str), buffer);
return [self stringFromBytes:buffer length:CC_SHA1_DIGEST_LENGTH];
}
- (NSString *)stringFromBytes:(uint8_t *)bytes length:(int)length {
NSMutableString *strM = [NSMutableString string];
for (int i = 0; i < length; i++) {
[strM appendFormat:@"%02x", bytes[i]];
}
return [strM copy];
}
4、散列函数总结
散列函数计算,除了以上列出的计算方法和代码外,也可以对文件进行散列计算,生成数据指纹。或者对于保密要求较高的情况,进行加盐处理,HMAC散列计算等!
封装代码已收藏