在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一章的介绍。