今天项目中忽然想到这个问题,在这儿总结下.
首先,随机数的大家都知道的,就不多说了,附上一个链接: http://blog.csdn.net/ouyangtianhan/article/details/17464149
在文章中也提到 rand()和random()实际并不是一个真正的伪随机数发生器,在使用之前需要先初始化随机种子,否则每次生成的随机数一样。
这两个的使用方法如下
srand((unsigned)time(NULL));
RegMe.RanMe = rand() % 100;
在这儿利用了时间种子。但是对应的当时间种子相同的时候,这个就会变得不安全,因为如果有人想破解你的代码,将srand((unsigned)time(NULL));
改完srand(1);
那么产生的随机数的序列将会是一样的,产生的随机数就是一样的。
还有另一种方法就是,设法使时钟停止,可能也会产生上面的情况。 random()的产生的随机数比rand()范围大,但也是跟rand()同理的。
因为遇到这种不安全随机函数,所以用了SecRandomCopyBytes
产生一个256随机秘钥;
Generates an array of cryptographically secure random bytes.
生成一组密码安全的随机数。
一个数:
uint8_t a = 0;
int returnValue = SecRandomCopyBytes(kSecRandomDefault, 1, &a);
多个数
uint8_t a[2];
int returnValue = SecRandomCopyBytes(kSecRandomDefault, 2, a);
我是这么使用的:
u_int32_t a;
int returnValue = SecRandomCopyBytes(kSecRandomDefault, sizeof(u_int32_t), &a);
因为要替换的是random()的函数,所以使用的是u_int32_t,生成的a就是随机数了。所以在项目中尽量避免使用random()、srandom()。Over。
喜欢的可以给个爱心❤️哦,谢了。。