如何制作密码管理器

电子说

1.3w人已加入

描述

步骤1:了解现有技术,项目和产品

Arduino

我相信很多人仍然使用上面描述的技术来记住他们的密码,即他们将它们存储在笔记本或便利贴上。这有两个原因是危险的。显然,如果有人偷了你的笔记本电脑,那么游戏结束了。 PasswordPump会对您的密码进行加密,并需要输入主密码才能访问所有其他密码;所以如果有人偷了它,他们仍然无法获取你的密码。其次,人们并不总是选择真的难以猜测的密码,甚至是用字典攻击来暴力破解。密码泵的最佳功能之一是它允许您生成并记住31个字符密码,这些密码是ASCII字符,数字和符号的随机混合。

我认为与PasswordPump功能集最匹配的商业产品是Mooltipass Mini Offline Password Keeper;在撰写本文时,运费前$ 79.00。 Mooltipass在某些重要方面有所不同,似乎是一个很好的,成熟的开源产品,也是建立在ATMega32u4上的。我最近才意识到一个开源密码管理器Memtype,它声称是“一个优雅的解决方案,可以将你的凭据存储在各处”。它看起来真的很酷,其中最酷的一点是它建立在ATTiny上!最后,在这个网站上有另一个类似的项目,Arduino Pro Micro上的密码管理器,这是一个很好的例子,甚至提供了一种通过PC上的程序编辑凭据的方法。但是,Mooltipass,Memtype或密码管理员不是这个项目的灵感来源。这个项目的灵感来自Automated Password Typer。然而,凭据被硬编码到Automated Password Typer中,并且无法添加新的,删除旧的或编辑现有凭证(除了修改源代码,重新编译和重新刷新);和锁定位未设置为保护凭据。我开始扩展该项目中提出的想法,之后有2000行代码,使用PasswordPump登陆。

步骤2:获取零件

Arduino

数量 描述成本

- 1 Arduino Pro Micro $ 2.87

- 1 RGB LED 0.02

- 2电阻4.7k~0.03

- 3电阻220~0.04

- 1自定义PCB 1.10

- 1旋转编码器0.42

- 1旋钮0.15

- 1 OLED 128x32 1.64

- 1瞬时按钮0.01

- 2 25LC256外部EEprom 1.89

* 零件总成本:8.17美元

*请记住,您需要一根微型USB转USB线和面包板

步骤3 :进行硬件连接

Arduino

Arduino

此处提供了Fritzing图。这些表也可以在这里找到,我可以更好地格式化它们,这可能会更有帮助。

Arduino Pro Micro (带ATMega32u4微控制器)

数据表

Arduino Pro Micro 引脚编号。,名称,Arduino,AVR, - 连接到/注释

TX D1 PD3 - 未连接

RX D0 PD2-未连接

GND-未连接

GND-未连接

SDA D2 PD1 - SSD1306 SDA,4.7k上拉

SCL D3 PD0 - SSD1306 SCL,4.7k上拉

A6 D4 PD4 - 未连接

D5 PC6 - 未连接

A7 D6 PD7 - 用于25LC256的引脚1备用芯片选择

D7 PE6 - 旋转按钮

A8 D8 PB4 - 旋转销2

A9 D9 PB5 - 旋转销1

A10 D10 PB6 - 针对25LC256的针1主芯片选择

MOSI D16 PB2 - 引脚5主25LC256,备用25LC256

MISO D14 PB3 - 引脚2主25LC256,备用25LC256

SCLK D15 PB1 - 引脚6主25LC256,备用25LC256

A0 D18 PF7-未连接,必须浮动用于随机#发电机

A1 D19 PF6 - 红色RGB引脚

A2 D20 PF5 - 绿色RGB引脚

A3 D21 PF4 - 蓝色RGB引脚

Vcc(+ 3V) - 正轨

复位 - 复位按钮

GND - 负极接地轨,GND RGB,GND SSD1306,GND编码器按钮,GND 2 25LC256芯片

RAW(USB + 5V) - 未连接

25LC256 (外部EEprom)测试部件:MICROCHIP - 25LC256-I/P - 256K SPI™总线串行EEPROM DIP8

数据表

1st 25LC256

Number。,Name,ConnectTo,Note

CS D10 PB6 - 引脚13 promicro芯片选择输入

SO D14 - 引脚15 promicro MISO - 串行数据输出

WP VCC - 引脚21 promicro写保护

Vss GND - 引脚23 promicro接地

SI D16 - 引脚14 promicro MOSI - 串行数据输入

SCK D15 - 引脚16 promicro SCLK - 串行时钟输入

HOLD VCC - 引脚21 promicro保持输入

Vcc VCC - 引脚21电源电压

第二25LC256

编号。,名称,连接,注意

CS D10 PD7 - 引脚06 promicro芯片选择输入

SO D14 - 引脚15 promicro MISO - 串行数据输出

WP VCC - 引脚21 promicro写保护

Vss GND - 引脚23 promicro接地

SI D16 - 引脚14 promicro MOSI - 串行数据输入

SCK D15 - 引脚16 promicro SCLK - 串行时钟输入

HOLD VCC - 引脚21 promicro保持输入

Vcc VCC - 引脚21 promicro电源电压

Ste第4页:源代码

Arduino

源代码可在此处找到。它在线记录很多,所以我不打算在这里逐行完成。

我确定程序中还有缺陷(实际上,我所知道的所有缺陷都列在程序顶部的注释部分,还有一个列表我所提到的缺陷)。因此,使用该产品需要您自担风险。

重要:我建议您在添加,删除或修改凭据时备份对主EEprom所做的更改,以使您的辅助EEprom保持最新状态。然后使用第三个EEprom,以便对凭据进行两次备份。最重要的是,定期将凭证转储到您存储在拇指驱动器上的加密文件中的文件,并将拇指驱动器固定在安全或保险箱中。最后,让您的帐户保持最新,这样如果您需要重置忘记的密码,您可以这样做。此产品未经过专业测试,质量目的,您可能会丢失凭据。您已获得源代码,以便您可以更正找到的任何缺陷。也就是说,我已经使用该设备几个月没有发生事故了,我将所有凭据存储在其中,其中许多使用生成的密码功能,所以如果我丢失设备和备份我我需要重置我的帐户,因为在这一点上我绝对无法知道密码是什么。我也按照上面的建议维护备份。

重要披露:使用提供的加密库我努力加密存储在外部25LC256上的所有凭据使用AES128的EEprom(并散列主密码,使用SHA256存储在内部EEprom上)。我已经使用了哈希主密码和每组凭据。这个项目是我第一次使用加密,并且没有正式的代码审查,所以我可能做错了,标准免责声明(买家当心)适用于这种情况。我使用PC和CH340 24/25系列EEprom闪存BIOS USB编程器检查了外部EEprom芯片的内容(存储了多组凭据后),所有用户名,帐户名和密码都显示为加密状态。但是,我很痛苦地意识到加密很容易做错,因此请谨慎行事。如果您熟悉这方面的内容,我将非常感谢代码审查和一些建设性的反馈(请直接与我联系)。

草图目前使用97%的程序存储区域和66%的动态内存。这使得向产品添加新功能非常困难,而无需将其更换为现有功能。我想添加几个新功能,但由于内存限制,我不能。例如,在完全不活动1小时后,设备超时并且您已退出该设备。我想让这个时间段可配置(例如,如果你愿意,可以将它设置为2小时),但我根本没有空间来添加该功能。我认为一个小时可能是一个很好的妥协,当我在我身边的设备上工作时,我会定期将旋转编码器向任意方向旋转一两次,以便自动注销一小时。

步骤5:库

如果要编译源代码,需要在Arduino IDE中安装以下库:

- https://rweather.github.io/arduinolibs/index.html 。.. - AES和SHA库,麻省理工学院许可证。

- https://github.com/LennartHennigs/Button2 - 用于旋转编码器上的按钮,版权所有(c)2017 LennartHennigs,MIT License。

- https://github.com/LennartHennigs/Button2 - 用于旋转编码器,GNU GPL版本3.

- https://github.com/LennartHennigs/Button2 - 用于将字符发送到键盘,就像用户输入GNU Lesser General Public License一样。

- https://github.com/LennartHennigs/Button2 - 用于内部EEprom

- https://github.com/LennartHennigs/Button2 - 用于SSD1306显示设备,Bill Greiman

步骤6:编译

Arduino

确保安装了所有必需的库。将董事会设置为“Arduino Leonardo”。请记住,您将通过外部程序员上传,因此请在Programmer中设置该值。我使用Pololu USB AVR编程器。

步骤7:闪烁程序

Arduino

我正在使用外部程序员将程序刻录到设备上。即从Arduino IDE我选择Sketch - 》 Upload Using Programmer将程序发送到Atmel ATMega32u4/Arduino Pro Micro。我这样做的部分原因是因为它覆盖了引导装载程序,我想要覆盖引导因为通过这样做,我在设备的设备上有更多的空间。如果引导加载程序存在,我认为该程序不适合Pro Micro,但我还没有测试过。我也不认为由于其他原因,设备将与引导加载程序一起正常工作。因此,我使用Pololu USB AVR编程器。在使用外部编程器编程时,我仍然需要通过USB电缆为设备供电。如果你通过以下方式构建设备如果您希望能够加载固件,请确保在将Arduino Pro Micro焊接到USB板后,不要自行寻找部件,或者如果您使用该套件进行构建,请务必不要剪断插头引脚。如果您希望能够加载固件。插头引脚与PCB板齐平,将无法重新启动设备;您需要将VDD,GND,RST,MOSI,MISO和SCK连接到外部编程器的Arduino Pro Micro以闪存程序。这里有关于这样做的说明。请放心,我对锁定位的初始设置不会阻止您重新刷新程序。如果要在重新刷新程序后重置锁定位,则可以执行此操作。对我来说,最简单的方法是使用Atmel Studio和我的USB AVRISP XPII。但是你真的不需要设置锁定位,因为无论如何,源代码现在都可供所有人使用。存储在内部EEprom中的主密码使用SHA-256进行哈希处理。

步骤8:操作

要打开设备,只需使用micro USB Micro-B插头将其插入USB端口/插座即可 - 插头线,与用于为Android手机充电的线缆相同。第一次将其插入驱动程序时可能需要安装。可以在源代码部分中引用的源代码存储库中下载该驱动程序。

首次启动设备时,您会看到:

主密码 2019年3月11日 (或最近编译的日期)

此时您需要输入主密码。尝试选择您会满意的主密码,因为如果您想要更改它,您必须重置设备,这将清除您的所有凭据。之后只有一种方法可以通过键盘或旋转编码器将凭证键入设备。还要尝试选择可以更快速地输入设备的密码。它应该是大小写的组合,带有数字,也许是一个或两个符号。我喜欢选择几乎完全用左手打字的密码,我发现它们更容易通过旋转编码器输入。你应该选择一个强密码;字母,大写和小写,数字和特殊字符的组合,长度在7到14个字符之间。要输入字符,请转动旋转编码器,直到出现该字符,然后向下按下旋转编码器(短按)以选择字符。如果你犯了错误,目前无法备份,所以要小心(或者如果你可以把它挤进来自己增强代码!)。输入完整主密码后,长按设备(单击旋转编码器超过1/2秒)。您刚输入主密码,现在您已准备好输入一组凭据。

通过旋转编码器移动菜单项,顺时针向下移动列表,逆时针向上移动。帐户名称按字母顺序存储。要选择项目,请单击旋转编码器(短按)。要备份,请按住旋转编码器超过半秒钟(长按)。

添加凭据

添加一组通过键盘的凭据您需要打开一个串行终端。最适合我的是Arduino串行终端。因此,如果您打开Arduino IDE,请转到Tools-》 Ports并选择Arduino/Genuino Micro端口。然后选择工具 - 》串行监视器(或Ctl + Shift + M)。接下来,在您的PasswordPump上向下导航至Keyboard OFF并通过短按将其更改为键盘ON。导航回添加帐户并短按。您将看到:

帐户名称添加帐户

短按,然后切换回Arduino串行终端并输入帐户名称,然后是返回键。然后长按密码泵。你现在应该看到:

编辑用户名

[您输入的帐户名称]

再次短按,切换回Arduino串行终端并输入用户名,然后返回键。然后长按密码泵。您现在应该看到:

编辑密码

[您输入的帐户名称]

再次短按,切换回Arduino串行终端并输入密码,然后输入返回键。然后长按密码泵。你现在应该看到:

指示样式

[您输入的帐户名称]

再次短按并使用旋转编码器指定0或1.如果,则指定0提供用户名和密码,密码泵应在发送用户名之后和发送密码之前发送回车。如果在提供用户名和密码时,密码泵应在发送用户名之后和发送密码之前发送选项卡,请指定1。然后长按密码泵。您现在应该看到:

帐户名称[您输入的帐户名称]

再次长按,您会看到:

查找帐户

[您输入的帐户名称]

您已完成输入凭据。

请注意,您也可以仅使用旋转编码器输入凭据。键盘可以打开或关闭,没关系。只需使用旋转编码器以与输入主密码类似的方式输入凭证。

发送凭证 导航到查找帐户和短按。使用旋转编码器滚动您输入的凭据列表。当您找到与要发送到计算机的凭据关联的帐户名称时,请将输入焦点放在窗口中的用户名文本框中,提示您输入计算机上的凭据。在密码泵上你应该看到:

发送用户并通过

[您选择的帐户名称]

短按以发送用户名,回车符或制表符(取决于样式设置),然后是密码。如果您选择了正确的样式,现在应该登录到您的帐户/应用程序。

如果您只想将密码发送到计算机,然后回车,请使用旋转编码器向下滚动一次,直至看到:

发送密码

[您输入的帐户名称]

短按以发送密码和回车符。

同样,您只能发送用户名或只发送帐户名。

编辑凭据 要编辑一组现有凭据,首先要确定是通过键盘还是仅通过旋转编码器编辑凭据。如果您要通过键盘编辑凭据,请按照切换键盘输入中的说明进行操作。然后使用“查找帐户”导航到要编辑的帐户并单击。然后向下滚动到编辑信用并短按。然后滚动到要编辑的属性;帐户名称,编辑用户名,编辑密码或指示样式。现在点击即可。使用键盘以添加凭据中描述的方式重新输入属性,或者仅使用旋转编码器重新输入属性。然后长按以保存更改。如果您要为帐户生成新密码,请按照生成密码中的说明进行操作。

删除凭据 确保您拥有密码当前的EEprom备份。导航到“查找帐户”并单击。使用旋转编码器选择要删除的帐户,然后单击。使用旋转编码器向下滚动到Delete Acct并短按。通过旋转编码器选择Y并短按确认删除帐户的愿望。该帐户现在已经消失,它已从主EEprom芯片中消失。它尚未从备份EEprom中删除,因此如果您不小心删除了某个帐户,并且您有最近的备份,则可以恢复该备份,该帐户将重新出现。导航到“查找帐户”并验证您的帐户是否已删除。如果您无法滚动浏览所有帐户,则会发生间歇性发生的缺陷,并且管理所有帐户显示的链接列表已损坏。从EEprom恢复最新备份。如果您在删除帐户后立即备份EEprom,它也会从次要EEprom中擦除。

生成密码 在尝试将密码更改为新生成的密码之前,请仔细阅读所有这些说明。 PasswordPump最强大的功能是能够生成随机的31个字符密码并记住它们。这些密码非常难以猜测,并且不容易受到暴力破解帐户的攻击。在执行此操作之前,您应确保拥有所有凭据的当前备份。要为帐户生成密码,只需通过“查找帐户”查找帐户,然后通过单击帐户名称选择凭据。在计算机上的应用程序中,导航到更改密码功能,并将输入焦点放在“旧密码”文本框中。在PasswordPump上导航到发送密码(不发送密码)并短按。在计算机上的应用程序中,通过按键将输入焦点放在新密码文本框中。在PasswordPump中向下滚动到编辑信用并单击,然后向下滚动到Gen密码并单击。这会将密码更改为随机生成的31个字符的系列。现在长按一次,导航到发送密码(不发送密码)并短按。如果您需要确认新密码,请将输入焦点放在计算机应用程序中的该文本框上,然后再次单击。通过按返回键或以其他方式单击相应的按钮来确认您的密码更改。您现在在帐户上有一个随机的31个字符的密码,并且密码存在的唯一位置是在PasswordPump上的加密EEprom芯片上。此时,备份到EEprom和备份到文件是一个好主意,并确保您可以以某种方式从该帐户上丢失的密码中恢复。警告:如果由于未接受旧密码而尝试更改密码失败,请注意您刚刚使用新生成的密码覆盖了旧密码。要恢复旧密码,您需要从EEprom恢复备份并重试,或者转到拇指驱动器上的加密备份文件以获取帐户的当前密码,或使用任何机制从帐户恢复密码通过应用程序或网站可以使用。提前考虑并小心,这样您就不会将自己锁在账户之外!

退出 当您想要登录时在设备外部使用旋转编码器导航到Logout并短按。 RGB led从绿色变为蓝色。您现在已注销,必须再次输入主密码才能使用该设备。如果您要离开计算机去喝咖啡,最好先锁定计算机并注销PasswordPump。

切换键盘输入 导航到键盘ON/OFF。短按以切换设置。当键盘打开时,您可以使用添加凭据中描述的过程通过键盘输入凭据。如果您没有输入凭据,请将键盘设置为OFF。当设备关机且默认为键盘关闭时,不保存此设置。

显示/隐藏密码 使用旋转编码器导航到显示Psswrd ON/OFF。短按以切换设置。注销并关闭设备时会保存此设置。

备份到EEprom

在密码泵上使用旋转编码器导航到Backup EEprom。短按,然后通过旋转编码器选择Y并短按,确认您要从主EEprom备份到辅助EEprom。备份发生时RGB将呈黄色,然后变回绿色。

备份到文件

打开PasswordPump使用旋转编码器导航到备份到文件。在您的计算机上打开一个文本编辑器(一个没有自动完成功能),notepad.exe效果最好,并将输入焦点放在文本编辑器中。我个人使用UltraEdit,因为它内置了加密功能。然后短按“备份到文件”。主EEprom芯片的内容(存储在PasswordPump中的所有凭证)将转储到文本编辑器中。当操作完成时,RGB LED变为紫色,然后变为绿色。最好使用WinZip或类似方法将密码压缩,并将其存储在拇指驱动器上,然后将其存储在安全或保险箱中。从计算机中删除原始文件并清空垃圾箱。通过定期执行此操作使此文件保持最新。我随身携带加密文件放在一个安全地连接到我的钥匙环的拇指驱动器上,我在其他地方备份该文件。

从EEprom恢复备份

如果您决定要恢复EEprom备份(或者换句话说,具有辅助内容,备份EEprom将覆盖主EEprom的内容),则导航到恢复在PasswordPump上备份。短按并通过旋转编码器选择Y并短按确认操作。 RGB指示灯将变为黄色,直到操作完成,然后它变回绿色。

执行出厂重置 您想要的擦除主EEprom上的所有加密凭据并恢复出厂设置。在PasswordPump上使用旋转编码器一直导航到Reset。短按。通过旋转编码器选择Y并单击,确认您要恢复出厂设置并清除所有凭据和主密码。在设备恢复出厂设置时,RGB会慢速闪烁蓝色和红色,然后快速闪烁,然后变为蓝色。此时,您可以输入新的主密码。请注意,出厂重置不会消除备份EEprom上存储的凭据。如果使用相同的主密码,则可以恢复备份并查看凭据。如果您想要清除备份EEprom,请在输入新的主密码后选择Backup EEprom,或者交换主EEprom芯片和备用EEprom芯片的位置并再次恢复出厂设置。

步骤9:了解RGB颜色

绿色 - 已登录

蓝色 - 未登录

红色 - 登录尝试失败错误备份或初始化EEprom

紫色 - 发送信用卡

黄色 - 备份到EEprom

快速闪烁红色/蓝色 - 初始化外部EEprom

慢速闪烁红色/蓝色 - 初始化内部EEprom

步骤10:将其全部移动到PCB

Arduino

Arduino

这是我为PasswordPump设计的PCB。如果您有兴趣订购自己的设计文件,可以使用源代码。这是我用PCB板设计的第一个项目,欢迎有经验的人提供反馈。我想让设备更小,所以对此任何建议都表示赞赏。

步骤11:PCB组装

Arduino

装配应该相当明显。指南如下。如果您有任何问题,请在继续之前给我发送电子邮件(dan-murphy@comcast.net),我会回答您的问题并更新本网站。

1) S2 - 瞬时按钮,复位按钮,焊接到PCB的背面,以便在Pro Micro焊接到威廉希尔官方网站 板后可以触及。确保按钮的方向正确。见上图。

2) R1,R2,R3 - 220欧姆电阻器,将它们焊接到位。

3) R4,R5 - 4.7k欧姆电阻器,将它们焊接到位。

4) RGB - RGB LED,最长的引脚在RGB上是地面。它是左边的第三个洞或右边的第二个洞。它的连接迹线位于PCB的底部,而所有其他位于顶部。焊接引线时,注意不要在焊道之间桥接焊料。这是装配中最困难的部分。可能需要一些去焊技术来移除您意外创建的任何桥梁。使用万用表上的连续性功能确保在继续之前没有桥接。

5) U1 (标签已遮挡),U2 -solder 2 IC DIP插座到位。插座中的槽口应朝向板的底部(当将板放在板上时)。 25LC256芯片中的凹口或凹坑将面向Pro Micro。请参阅本博客顶部的图片。

6) ARD1 - 将公头连接到Pro Micro后(使用面包板或自定义PCB本身,焊接时)用于保持接头精确对准的接头,否则Pro Micro将无法安装到定制PCB中,将Micro Micro焊接到位,使面向PCB底部的微型USB端口按照顶部的图片进行焊接页。在将瞬时按钮焊接到位之前,请勿将Pro Micro焊接到位。将Pro Micro焊接到位后,切勿将引线与PCB齐平,否则您将永远无法重新刷新程序。

7) RE1 - 旋转编码器。旋转编码器的两个导线用于将编码器更牢固地固定到PCB上,需要将其稀疏或完全剪断;这些孔太小而且不对齐。我发出的用于制造的下一版PCB将解决这个问题。道歉。

8)最后的焊接步骤是将公头连接到OLED 128x32,然后将OLED 128x32焊接到PCB,使其悬挂在Pro Micro上。男性标题应该足够长,以实现这一目标。我使用弹性材料将显示器保持在适当的位置,并且引线穿透PCB上的孔,使它们与PCB的背面齐平,几乎完全戳穿,并且在那里有足够的引线焊接到PCB上。

9)将旋钮插入旋转编码器。如果您需要取下旋钮,请注意不要将旋转编码器从PCB上撕下来。

10)小心不要弯曲插针,将两个25LC256 IC插入插座(带凹坑)最接近Pro Micro的,请参见本博客顶部的图片。

11)将micro USB线的公头插入Pro Micro,将另一端插入计算机的USB端口。驱动程序很可能会自动安装。如果没有,它们可以在GitHub上找到。您的PasswordPump应显示:

PasswordPump

2019年3月11日

然后,三秒钟后:

主密码

2019年3月11日

单击旋转编码器一次,然后输入您选择的主密码。请参阅操作下的说明。

步骤12:未来

我目前受限于可用的闪存量给我在ATMega32u4,32k。所有空间都由程序使用。如果我有更多空间,我可以添加其他功能。特别是,我有兴趣编写可以在与PasswordPump完全接口的计算机上运行的GUI。

使用Arduino串行终端添加凭据充其量是尴尬的,但我认为需要更多的内存来纠正这种情况。我还希望有更多的EEprom空间,以便64个字节可用于用户名,密码和帐户名。另外我认为使用AES-256进行加密会更好。可能满足所有这些要求的设备是带有ATSAMD51的Adafruit ItsyBitsy M4 Express;以下是该网站的一些广告功能:

运行频率为120 MHz的Cortex M4处理器

512KB闪存(比Atmel ATmega 32u4大16倍) )

1.4“长0.7英寸宽(小于Pro Micro)

2MB SPI闪存(与两个25LC256芯片中的64k相比)

本机硬件I2C和串行(与SSD1306显示器接口)

内置加密引擎,带AES,256位(替换加密库)

每个操作系统支持的本机USB(发送凭证,如键盘)

可与Arduino IDE一起使用

内置RGB DotStar LED(替换PasswordPump上的RGB)

重置按钮

使用USB供电

在缺点下,我用于密码泵的v1的一些库将无法与ItsyBitsy一起使用;特别是键盘库以及SSD1306的库都会出现问题。可以抛出其他库,并且可以更容易地编写代码以适应相关的功能。最大的骗局是ItsyBitsy的价格,14.95美元,这将使生产PasswordPump的成本增加三倍。

步骤13:密码泵的初始版本

Arduino

Arduino

Arduino

以上是图片密码泵的前三个原型。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分