计算SHA1

57 篇文章 1 订阅
33 篇文章 1 订阅

在Android源码中,提供了计算SHA1签名的代码,对应位置:

  • 头文件:/system/core/include/mincrypt
  • 实现代码:/system/core/libmincrypt

本文用一个小例子说明其用法。


首先把上述代码拷贝到一个临时地方,比如:

flying-bird@flying-bird:~/examples/android/sha$ ll
总用量 24
drwxrwxr-x 3 flying-bird flying-bird 4096  5月 11 08:23 ./
drwxrwxr-x 4 flying-bird flying-bird 4096  5月 11 08:11 ../
-rw-rw-r-- 1 flying-bird flying-bird  476  5月 11 08:16 main.c
drwxr-xr-x 2 flying-bird flying-bird 4096  5月 11 08:02 mincrypt/
-rw-r--r-- 1 flying-bird flying-bird 4281  5月 11 08:01 sha.c
flying-bird@flying-bird:~/examples/android/sha$ ll ./mincrypt/
总用量 40
drwxr-xr-x 2 flying-bird flying-bird 4096  5月 11 08:02 ./
drwxrwxr-x 3 flying-bird flying-bird 4096  5月 11 08:23 ../
-rw-r--r-- 1 flying-bird flying-bird 1919  5月 11 08:02 dsa_sig.h
-rw-r--r-- 1 flying-bird flying-bird 2520  5月 11 08:02 hash-internal.h
-rw-r--r-- 1 flying-bird flying-bird 2306  5月 11 08:02 p256_ecdsa.h
-rw-r--r-- 1 flying-bird flying-bird 5044  5月 11 08:02 p256.h
-rw-r--r-- 1 flying-bird flying-bird 2413  5月 11 08:02 rsa.h
-rw-r--r-- 1 flying-bird flying-bird 2147  5月 11 08:02 sha256.h
-rw-r--r-- 1 flying-bird flying-bird 2167  5月 11 08:02 sha.h
flying-bird@flying-bird:~/examples/android/sha$ 

其中main.c是调用SHA1功能的小代码,如下:

#include <stdio.h>
#include <string.h>
#include "mincrypt/sha.h"

static void print_sha(const char *s, const uint8_t *digest)
{
    int i;
    
    printf("String to be sha1: %s\n", s);
    printf("sha1: ");
    for (i = 0; i < SHA_DIGEST_SIZE; i++) {
        printf("%02x", digest[i]);
    }

    printf("\n");
}

int main() 
{
    const char *s = "hello";
    uint8_t digest[SHA_DIGEST_SIZE];

    SHA_hash(s, strlen(s), digest);
    print_sha(s, digest);

    return 0;
}

编译&运行:

flying-bird@flying-bird:~/examples/android/sha$ gcc sha.c main.c -I./mincrypt
flying-bird@flying-bird:~/examples/android/sha$ ./a.out 
String to be sha1: hello
sha1: aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d
flying-bird@flying-bird:~/examples/android/sha$ 

再和Linux对应的sha1sum命令执行的结果进行对比:

flying-bird@flying-bird:~/examples/android/sha$ echo -n "hello" > hello.txt
flying-bird@flying-bird:~/examples/android/sha$ sha1sum -b hello.txt
aaf4c61ddcc5e8a2dabede0f3b482cd9aea9434d *hello.txt
flying-bird@flying-bird:~/examples/android/sha$ 

可以看到两个签名加密结果是完全一样的。


除了Android,JDK也包括了SHA1&MD5等加密算法,即MessageDigest;C/C++方面,除了本文所示的Android实现,也有其他一些实现,比如:http://www.packetizer.com/security/sha1/;Python也有hashlib模块。


实际项目中,往往不会仅用SHA1签名做安全认证。关于这方面较好的入门材料,可以参考《Core Java》卷II Chapter 9 Security一章的介绍。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值