如果访问代码本身需要唯一,那么要确保不发生冲突将变得困难。如果您可以容忍两个用户可能偶然共享相同的访问代码,则会更加容易。
采用所提议的电子邮件地址与已知字符串连接的 base-64 编码可能会引入安全漏洞。如果使用电子邮件地址与已知单词连接的 base64 输出,则用户可以轻松地解码访问代码并推导出用于生成代码的算法。
其中一个选项是使用带有已知秘密密钥的电子邮件地址的 SHA-1-HMAC 哈希 (System.Cryptography.HMACSHA1)。哈希的输出为 20 字节序列。然后可以确定性地截断哈希。例如,以下代码
GetCodeForEmail("test@example.org")
给出代码为 'PE2WEG':
static char[] ValidChars = {'2','3','4','5','6','7','8','9',
'A','B','C','D','E','F','G','H',
'J','K','L','M','N','P','Q',
'R','S','T','U','V','W','X','Y','Z'};
const string hashkey = "password";
const int codelength = 6;
string GetCodeForEmail(string address)
{
byte[] hash;
using (HMACSHA1 sha1 = new HMACSHA1(ASCIIEncoding.ASCII.GetBytes(hashkey)))
hash = sha1.ComputeHash(UTF8Encoding.UTF8.GetBytes(address));
int startpos = hash[hash.Length -1] % (hash.Length - codelength);
StringBuilder passbuilder = new StringBuilder();
for (int i = startpos; i < startpos + codelength; i++)
passbuilder.Append(ValidChars[hash[i] % ValidChars.Length]);
return passbuilder.ToString();
}