接口的加密和数字签名怎么实现很多人对这个问题比较感兴趣,下面一起来看iOS 接口加密方法-ASE256和数字签名,希望可以帮助到你。
简述数字签名的实现步骤?
数字签名的实现步骤如下:
1、发送报文
发送方用一个哈希函数从报文文本中生成报文摘要,然后用自己的私人密钥对这个摘要进行加密,这个加密后的摘要将作为报文的数字签名和报文一起发送给接收方。
2、接收报文
接收方首先用与发送方一样的哈希函数从接收到的原始报文中计算出报文摘要,接着再用发送方的公用密钥来对报文附加的数字签名进行解密。
这样一来,如果这两个摘要相同,那么接收方就能确认该数字签名是发送方的。
扩展资料
数字签名的相关明细
数字签名又叫电子签名,可以通过模仿传统手写签名以某种方式“签署”一份数字文档,该签名与物理签名有相同的法律效力。与物理世界中的手写签名对应,数字签名可被视为数字世界中的电子签名,不过目前数字签名只可用非对称密码算法实现。
据了解,数字签名的作用主要包括:
1、接收方能辨认发送方的签名,但不可以伪造。
2、发送方将签过名的信息进行发出后,再否认就不行了。
3、接收方对收到的签名信息否认是不行的。
4、一旦发送方和接收方有矛盾,仲裁者将有足够的证据评判。
参考资料来源:百度百科-数字签名
iOS 接口加密方法-ASE256和数字签名
//这是需要加密的字典,里面存储这需要上传的参数
NSMutableDictionary *bodyDict=[[NSMutableDictionary alloc] init];
[bodyDict setValue:@"80088202220" forKey:@"phone"];
//这是需要配置的key,需要前后端统一配置
#define StrApiKey @"ios-to-panda"
#define StrSecretKey @"Z4Q5eE}{9Wk8h-P]j3D~$IH8Qo)~)L,c"
#define EncryptKey @"UfbFJ?}2G=WlAu}z`ilz'_^Tf8(&3(yg"
1,接口加密首先需要加时间戳
bodyDict = [self signature:bodyDict strApiKey:StrApiKeystrSecretKey:StrSecretKey];
//数字签名
-(NSMutableDictionary*)signature:(NSMutableDictionary*)bodyDict strApiKey:(NSString*)strApiKey strSecretKey:(NSString*)strSecretKey{
//时间戳
NSString*time = [NSStringstringWithFormat:@"%ld",[selfgetTimeSp]];
[bodyDictsetObject:[NSStringgenmd5:time]forKey:@"nonce"];
[bodyDictsetObject:timeforKey:@"time_stamp"];
//升序排序
NSArray*keyArray = [bodyDictallKeys];
// 利用block进行排序
NSArray*sortkeyArray = [keyArraysortedArrayUsingComparator:^NSComparisonResult(id _Nonnullobj1,id _Nonnullobj2) {
NSComparisonResultresult = [obj1compare:obj2];
returnresult;
}];
inti=0;
NSString*strBaseString =@"";
//生成Base String
for(NSString* paraminsortkeyArray) {
NSString*key;
if([UserShareMgrisUserString:paramCompare:@"city_name"]) {//如果其中有中文需要转码
key = [[DataRequestshareInstance]urlEncode:[bodyDictobjectForKey:[NSStringstringWithFormat:@"%@",param]]];
}else{
key = [bodyDictobjectForKey:[NSStringstringWithFormat:@"%@",param]];
}
if(0==i) {
strBaseString = [NSStringstringWithFormat:@"%@=%@",param,key];
i++;
}else{
strBaseString = [NSStringstringWithFormat:@"%@&%@=%@",strBaseString,param,key];
}
}
//生成签名
NSString*sign = [selfhmacSha1:strBaseString :strSecretKey];
[bodyDictsetObject:signforKey:@"sign"];
returnbodyDict;
}
//hmacsga1加密
- (NSString*)hmacSha1:(NSString*)public_key :(NSString*)private_key{
NSData* secretData = [private_key dataUsingEncoding:NSUTF8StringEncoding];
NSData* stringData = [public_key dataUsingEncoding:NSUTF8StringEncoding];
constvoid* keyBytes = [secretDatabytes];
constvoid* dataBytes = [stringDatabytes];
///#define CC_SHA1_DIGEST_LENGTH 20 /* digest length in bytes */
void* outs = malloc(CC_SHA1_DIGEST_LENGTH);
CCHmac(kCCHmacAlgSHA1, keyBytes, [secretDatalength], dataBytes, [stringDatalength], outs);
// Soluion 1
NSData* signatureData = [NSData dataWithBytesNoCopy:outs length:CC_SHA1_DIGEST_LENGTH freeWhenDone:YES];
NSString *body = [signatureData base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];
returnbody;
}
//获得当前时间戳
-(long)getTimeSp{
longtime;
NSDate*fromdate=[NSDatedate];
time=(long)[fromdatetimeIntervalSince1970];
returntime;
}
//md5加密方法,直接引用三方库的更好
+ (NSString*)genmd5:(NSString*)str
{
constchar*cStr = [strUTF8String];
unsignedcharresult[16];
CC_MD5( cStr,strlen(cStr), result );
return [NSString stringWithFormat:
@"%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X%02X",
result[0], result[1], result[2], result[3],
result[4], result[5], result[6], result[7],
result[8], result[9], result[10], result[11],
result[12], result[13], result[14], result[15]];
}
2,进行ase256加密
//将数字签名后的字典转换成data
NSError*parseError =nil;
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:bodyDict options:NSJSONWritingPrettyPrinted error:&parseError];
//将data转成字符串
NSString *bodyString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
//将字符串转成data,至于这里为什么转2次,是因为不转码的话 php解析不了
NSData *dataTake = [bodyString dataUsingEncoding:NSUTF8StringEncoding];
//进行ase256加密
dataTake = [self AES256Encrypt:dataTake WithKey:EncryptKey];
//将data转换成字符串
NSString *body = [dataTake base64EncodedStringWithOptions:NSDataBase64Encoding64CharacterLineLength];
//AES256加密
- (NSData*)AES256Encrypt:(NSData*)Data WithKey:(NSString*)key //加密
{
CCCryptorRefcryptor =NULL;
CCCryptorStatusstatus =kCCSuccess;
idiv =nil;
NSParameterAssert([key isKindOfClass: [NSData class]] || [key isKindOfClass: [NSString class]]);
NSParameterAssert(iv ==nil|| [iv isKindOfClass: [NSData class]] || [iv isKindOfClass: [NSString class]]);
NSMutableData* keyData, * ivData;
keyData = [(NSMutableData *)[self SHA256Hash:[key dataUsingEncoding:NSUTF8StringEncoding]] mutableCopy];
if( [ivisKindOfClass: [NSStringclass]] )
ivData = [[ivdataUsingEncoding: NSUTF8StringEncoding] mutableCopy];
else
ivData = (NSMutableData*) [ivmutableCopy]; // data or nil
// ensure correct lengths for key and iv data, based on algorithms
NSUIntegerkeyLength = [keyDatalength];
if( keyLength <16){
[keyDatasetLength:16];
}elseif( keyLength <24){
[keyDatasetLength:24];
}else{
[keyDatasetLength:32];
}
[ivDatasetLength: [keyDatalength]];
status =CCCryptorCreate( kCCEncrypt, kCCAlgorithmAES128, kCCOptionPKCS7Padding,
[keyDatabytes], [keyDatalength], [ivDatabytes],
&cryptor );
if( status ==kCCSuccess)
{
NSData* result = [self_runData:(NSData*)DataCryptor: cryptorresult: &status];
CCCryptorRelease( cryptor );
returnresult;
}
return nil;
}
- (NSData*) SHA256Hash:(NSData*)data
{
unsigned char hash[CC_SHA256_DIGEST_LENGTH];
(void)CC_SHA256( [databytes], (CC_LONG)[datalength], hash );
return ( [NSData dataWithBytes: hash length: CC_SHA256_DIGEST_LENGTH] );
}
- (NSData*) _runData:(NSData*)keyData Cryptor: (CCCryptorRef) cryptor result: (CCCryptorStatus*) status
{
size_tbufsize =CCCryptorGetOutputLength( cryptor, (size_t)[keyDatalength],true);
void* buf =malloc( bufsize );
size_tbufused =0;
size_tbytesTotal =0;
*status =CCCryptorUpdate( cryptor, [keyDatabytes], (size_t)[keyDatalength],
buf, bufsize, &bufused );
if( *status !=kCCSuccess)
{
free( buf );
return(nil);
}
bytesTotal += bufused;
// From Brent Royal-Gordon (Twitter: architechies):
// Need to update buf ptr past used bytes when calling CCCryptorFinal()
*status =CCCryptorFinal( cryptor, buf + bufused, bufsize - bufused, &bufused );
if( *status !=kCCSuccess)
{
free( buf );
return(nil);
}
bytesTotal += bufused;
return( [NSDatadataWithBytesNoCopy: buflength: bytesTotal] );
}
3,这样就可以使用afn进行上传了
NSMutableDictionary *paramDict=[[NSMutableDictionary alloc] init];
[paramDictsetValue:bodyforKey:@"data"];
如何使用加密和数字签名
用非常基本的词汇说,加密是一种以密码方式发送信息的方法。只有拥有正确密钥的人才能解开这个信息的密码。对于其他人来说,这个信息看起来就像是一系列随机的字母、数字和符号。如果你要发送不应该让其他人看的敏感信息时,加密是特别重要的。由于电子邮件是在互联网上发送的,可能被攻击者拦截,对敏感的信息增加一个额外的保护层是很重要的。 同数字签名一样,公共密钥加密使用PGP等软件,使用数学算法转换信息并且依靠公共和专用密钥。但是,加密和数字签名是有区别的,加密的目的是通过把信息翻译成密码秘密地隐藏内容。数字签名的目的是完整性和身份识别性,验证一个信息的发送者和指出内容没有被修改。虽然加密和数字签名能够单独使用,但是,你还可以对加密的信息采用数字签名。 当你签署一个信息时,你使用你的专用密钥,任何有你的公共密钥的人都能够验证这个签名是合法的。当你加密一个信息的时候,你为接收你的信息的人使用这个公共密钥,并且使用他或者她的专用密钥解码这个信息。用于人们要保持自己的专用密钥的机密,并且使用口令保护这些密钥,这个信息的接收者应该是惟一的能够观看这个信息的人。 1.获得你要他能够阅读这个信息的人的公共密钥。如果你从一个公共密钥环得到这个密钥,你可以直接与那个人取得联系,使用密钥验证一系列有关的字母和数字是正确的指纹。 2.使用他们的公共密钥加密这个电子邮件。大多数电子邮件客户端软件都有轻松进行这项工作的功能。 3.当这个人收到这个信息的时候,他或者她将能够对这个信息解密。
数字签名的实现方法
数字签名,就是只有信息的发送者才能产生的别人无法伪造的一段数字串,这段数字串同时也是对信息的发送者发送信息真实性的一个有效证明。数字签名是非对称密钥加密技术与数字摘要技术的应用。一套数字签名通常定义两种互补的运算,一个用于签名,另一个用于验证。
数字签名算法是依靠公钥加密技术来实现的。
在公钥加密技术里,每一个使用者有一对密钥:一把公钥和一把私钥。公钥可以自由发布,但私钥则秘密保存;通过公钥推算出私钥的做法不可能实现。
普通的数字签名算法包括三种算法:
1、密码生成算法;
2、标记算法;
3、验证算法。
简述数字签名的实现步骤
数字签名的使用场景不同,则签署的流程也有所差异。以在契约锁平台签约为例,需要三步完成在电子合同上签署数字签名的步骤:
1、登录契约锁网址,注册并实名认证;
2、将需要签署的电子合同上传,并填写签署人信息;
3、签署人接收到签署请求,经过身份认证后,使用数字签名完成签署。