使用C#开发Web应用时YubiKey OTP Slot1编程的访问码长度异常问题求助
解决YubiKey OTP Slot访问码长度限制问题
我来帮你搞定这个YubiKey编程的问题!核心问题出在访问码的字节长度不匹配——YubiKey要求访问码最多6字节,但你把7位序列号转成ASCII字符串后得到了7字节,直接触发了API的长度限制错误。
为什么会报错?
YubiKey的Slot访问码是6字节以内的二进制值,而你通过Encoding.ASCII.GetBytes(_yubiKey.SerialNumber.ToString())把7位数字转成ASCII字符串时,每个数字对应1字节,最终得到7字节的数组,超出了API允许的最大长度,所以Execute()会抛出"Access code must be 6 or fewer bytes."的错误。
正确的访问码生成方式
既然你之前是用序列号作为访问码保护Slot1,那需要把序列号数值转换成6字节的二进制数组,而不是直接转字符串。这样既能保证长度符合要求,又能和你之前设置的访问码匹配(前提是你之前也是用这种方式生成的访问码)。
修改后的代码示例
try { // 直接在using中初始化OtpSession,避免重复实例化 using (OtpSession otp = new OtpSession(_yubiKey)) { Memory<byte> hmac_key = Generate_Seed(); // 将序列号转换为6字节的二进制数组(大端字节序,符合YubiKey习惯) long serialNumber = _yubiKey.SerialNumber; byte[] accessCodeBytes = new byte[6]; for (int i = 5; i >= 0; i--) { accessCodeBytes[i] = (byte)(serialNumber & 0xFF); serialNumber >>= 8; } Memory<byte> serial_number = accessCodeBytes; SlotAccessCode access_code = new SlotAccessCode(serial_number); otp.ConfigureHotp(Slot.ShortPress) .UseCurrentAccessCode(access_code) .AppendCarriageReturn(true) .UseNumericKeypad(true) .UseKey(hmac_key) .Execute(); } } catch (Exception ex) { if (ex.ToString().Contains("YubiKey Operation Failed [Warning, state of non-volatile memory is unchanged.]")) lblMessage.Text = "YubiKey could not be configured. Please use the proper access code."; }
额外提醒
- 如果之前你设置访问码时用的是序列号字符串的前6位ASCII,那上面的代码就不匹配了——这种情况下你需要改成取序列号字符串的前6位转成ASCII,比如
Encoding.ASCII.GetBytes(_yubiKey.SerialNumber.ToString().Substring(0,6)),但更推荐用二进制转换的方式,因为ASCII方式容易受数字长度变化影响。 - 注意字节序:YubiKey的访问码通常使用大端字节序,上面的代码通过从后往前填充数组实现了大端转换,确保数值正确映射。
内容的提问来源于stack exchange,提问作者Dennis Robare
相关产品推荐
相关产品推荐

