NodeJS之加解密Crypto

发表于 2年以前  | 总阅读数:387 次

互联网时代,网络上的数据量每天都在以惊人的速度增长。同时,各类网络安全问题层出不穷。在信息安全重要性日益凸显的今天,作为一名开发者,需要加强对安全的认识,并通过技术手段增强服务的安全性。crypto模块的目的是为了提供通用的加密和哈希算法。用纯JavaScript代码实现这些功能不是不可能,但速度会非常慢。Nodejs用C/C++实现这些算法后,通过cypto这个模块暴露为JavaScript接口,这样用起来方便,运行速度也快。

编码方式

为什么信息传输需要编码?

在开发加密解密数据的时候碰到需要把加密好的字节数组转换成 String 对象用于网络传输的需求,如果把字节数组直接转换成 UTF-8 等编码方式的话肯定会存在某些编码没有对应的字符(8bit只能表示128个字符),在编码和解析过程中会出错,不能正确地表达信息。这时就可以通过常用的二进制数据编码方式 Base64 编码或者 Hex 编码来实现。

「hex编码」

  • 编码原理

将一个8位的字节数据用两个16进制数表示出来

  1. 将8位二进制码重新分组成两个4位的字节
  2. 其中一个字节的低4位是原字节的高4位,另一个字节的低4位是原数据的低4位
  3. 高4位都补0,然后输出这两个字节对应的十六进制数字作为编码
  • 例子
ASCII码:A(65)

二进制码:0100 0001

重新分组: 00000100  00000001

十六进制: 4         1

Hex编码:41

就算原文件是纯英文内容,编码后内容也和原文完全不一样,普通人难以阅读但由于只有16个字符,听说一些程序员大牛能够记下他们的映射关系,从而达到读hex编码和读原文一样的效果。另外,数据在经过hex编码后,空间占用变成了原来的2倍。

「base64编码」

  • 编码原理

Base64编码是通过64个字符来表示二进制数据,64个字符表示二进制数据只能表示6位,所以它可以通过4个 Base64字符来表示3个字节,如下是Base64的字符编码表

img

  • 举个Base64编码的例子,图就很浅显易懂了

img

  • 字符串长度不是3的倍数时补0,也就是“=”

img

由64个字符组成,比hex编码更难阅读,但由于每3个字节会被编码为4个字符。

所以,空间占用会是原来的4/3,比hex要节省空间。另外要注意的是,虽然Base64编码后的数据难以阅读,但不能将其作为加密算法使用,因为它解码都不需要你提供密钥啊

「urlencode编码」

  • 编码原理

urlencode编码,看名字就就知道是设计给url编码的对于a-zA-Z0-9.-_ ,urlencode都不会做任何处理原样输出,而其它字节会被编码为%xx(16进制)的形式,其中xx就是这个字节对应的hex编码。由于英文字符原样保留,对于以英文为主的内容,可读性最好,空间占用几乎不变,而对于非英文内容,每个字节会被编码为%xx的3个字符,空间占用是原来的3倍,所以urlencode是一个对英文友好的编码方案。

「Hash」

摘要:将不固定长度的消息作为输入Hash函数,生成固定长度的输出,这段输出称之为摘要

适用场景:敏感信息的校验和存储、验证消息完整 & 未被篡改

「特点」

  1. 输出长度固定:输入长度不固定,输出长度固定(因算法而异,常见的有MD5、SHA系列)。
  2. 运算不可逆:已知运算结果的情况下,无法通过通过逆运算得到原始字符串。
  3. 高度离散:输入的微小变化,可导致运算结果差异巨大。
  4. 弱碰撞性:不同输入的散列值可能相同。

以MD5为例

MD5(Message-Digest Algorithm)是计算机安全领域广泛使用的散列函数(又称哈希算法、摘要算法),主要用来确保消息的完整和一致性。

常见的应用场景:密码保护、下载文件校验等。

「应用场景」

  1. 文件完整性校验:比如从网上下载一个软件,一般网站都会将软件的md5值附在网页上,用户下载完软件后,可对下载到本地的软件进行md5运算,然后跟网站上的md5值进行对比,确保软件的完整性
  2. 密码保护:将md5后的密码保存到数据库,而不是保存明文密码,避免拖库等事件发生后,明文密码泄漏。
  3. 防篡改:比如数字证书的防篡改,就用到了摘要算法。(当然还要结合数字签名等手段)

简单的md5运算

  • hash.digest([encoding])

计算摘要。encoding可以是hexbase64或其他。如果声明了encoding,那么返回字符串。否则,返回Buffer实例。注意,调用hash.digest()后,hash对象就作废了,再次调用就会报错。

  • hash.update(data[, input_encoding])

input_encoding可以是utf8ascii或者其他。如果data是字符串,且没有指定 input_encoding,则默认是utf8。注意,hash.update()方法可以调用多次。

const crypto = require('crypto');
const fs = require('fs');

const FILE_PATH = './index.txt'
const ENCODING = 'hex';

const md5 = crypto.createHash('md5');
const content = fs.readFileSync(FILE_PATH);
const result = md5.update(content).digest(ENCODING);
console.log(result);

// f62091d58876a322864f5a522eb05052

密码保护

前面提到,将明文密码保存到数据库是很不安全的

最不济也要进行md5后进行保存

比如用户密码是123456,md5运行后,得到输出:e10adc3949ba59abbe56e057f20f883e

这样至少有两个好处:

  1. 防内部攻击:网站开发者也不知道用户的明文密码,避免开发者拿着用户明文密码干坏事,以这种形式来保护用户的隐私
  2. 防外部攻击:如网站被黑客入侵,黑客也只能拿到md5后的密码,而不是用户的明文密码,保证了密码的安全性
const crypto = require('crypto');

const cryptPwd = (password) => {
    const md5 = crypto.createHash('md5');
    return md5.update(password).digest('hex');
}

const password = '123456';
const cryptPassword = cryptPwd(password);
console.log(cryptPassword);

// e10adc3949ba59abbe56e057f20f883e
  • 前面提到,通过对用户密码进行md5运算来提高安全性。

  • 但实际上,这样的安全性是很差的,为什么呢?

  • 稍微修改下上面的例子,可能你就明白了。相同的明文密码,md5值也是相同的。

  • 也就是说当攻击者知道算法是md5,且数据库里存储的密码值为e10adc3949ba59abbe56e057f20f883e时,理论上可以可以猜到,用户的明文密码就是123456

  • 事实上,彩虹表就是这么进行暴力破解的:事先将常见明文密码的md5值运算好存起来,然后跟网站数据库里存储的密码进行匹配,就能够快速找到用户的明文密码。

那么有什么办法可以进一步提升安全性呢?

答案是:密码加盐。

「密码加盐」

“加盐”这个词看上去很玄乎,其实原理很简单

就是在密码特定位置插入特定字符串后,再对修改后的字符串进行md5运算。

同样的密码,当“盐”值不一样时,md5值的差异非常大

通过密码加盐,可以防止最初级的暴力破解,如果攻击者事先不知道”盐“值,破解的难度就会非常大

const crypto = require('crypto');

const cryptPwd = (password, salt) => {
    const saltPassword = `${password}:${salt}`;
    console.log(`原始密码:${password}`);
    console.log(`加盐密码:${saltPassword}`);

    const md5 = crypto.createHash('md5');
    const result = md5.update(password).digest('hex');
    console.log(`加盐密码的MD5值:${result}`)
}



const password = '123456';
const salt = 'abc'
cryptPwd(password, salt);
/*
原始密码:123456
加盐密码:123456:abc
加盐密码的MD5值:e10adc3949ba59abbe56e057f20f883e
*/

「密码加盐:随机盐值」

通过密码加盐,密码的安全性已经提高了不少

但其实上面的例子存在不少问题

  • 假设字符串拼接算法、盐值已外泄,上面的代码至少存在下面问题:
  1. 短盐值:需要穷举的可能性较少,容易暴力破解,一般采用长盐值来解决。
  2. 盐值固定:类似的,攻击者只需要把常用密码+盐值的hash值表算出来。
  • 短盐值自不必说,应该避免

  • 对于为什么不应该使用固定盐值,这里需要多解释一下。很多时候,我们的盐值是硬编码到我们的代码里的(比如配置文件),一旦攻击者通过某种手段获知了盐值,那么,只需要针对这串固定的盐值进行暴力穷举就行了

  • 比如上面的代码,当你知道盐值是abc时,立刻就能猜到51011af1892f59e74baf61f3d4389092对应的明文密码是123456

那么,该怎么优化呢?答案是:随机盐值。

可以看到,密码同样是123456,由于采用了随机盐值,前后运算得出的结果是不同的

这样带来的好处是,多个用户,同样的密码,攻击者需要进行多次运算才能够完全破解

同样是纯数字3位短盐值,随机盐值破解所需的运算量 >> 固定盐值

示例代码如下

const crypto = require('crypto');

const getRandomSalt = () => {
    return Math.random().toString().slice(2,5);
}

const cryptPwd = (password, salt) => {
    const saltPassword = `${password}:${salt}`;
    console.log(`原始密码:${password}`);
    console.log(`加盐密码:${saltPassword}`);

    const md5 = crypto.createHash('md5');
    const result = md5.update(saltPassword).digest('hex');
    console.log(`加盐密码的MD5值:${result}`)
}

const password = '123456';

cryptPwd(password, getRandomSalt());

/*
原始密码:123456
加盐密码:123456:126
加盐密码的MD5值:3aeb1848ff63aa32b262bc3f8dd5bd82
*/

cryptPwd(password, getRandomSalt());

/*
原始密码:123456
加盐密码:123456:232
加盐密码的MD5值:21a427268a5094322146e18e47b135fb
*/

「HMAC功能」

HMAC的全称是Hash-based Message Authentication Code,也即在hash的加盐运算。

具体到使用的话,跟hash模块差不多,选定hash算法,指定“盐”即可。

和上面的例子的区别是一个是手动拼盐值,一个是利用HMAC模块

const crypto = require("crypto")
const fs = require("fs")

const FILE_PATH = "./index.txt"
const SECRET = 'secret'
const content = fs.readFileSync(FILE_PATH,{encoding:'utf8'})
const hmac = crypto.createHmac('sha256', SECRET);

hmac.update(content)
const output = hmac.digest('hex')
console.log(`Hmac: ${output}`)

// Hmac: 6f438ef66d3806ae14d6692d9610e55c41ebb4eb3ee73911a4d512bd1cade976

注:大文件可流式处理

加密 / 解密

加解密主要用到下面两组方法:

  • 加密:

  • crypto.createCipher(algorithm, password)

  • crypto.createCipheriv(algorithm, key, iv)

  • 解密:

  • crypto.createDecipher(algorithm, password)

  • crypto.createDecipheriv(algorithm, key, iv)

「crypto.createCipher / crypto.createDecipher」

先来看下 crypto.createCipher(algorithm, password),两个参数分别是加密算法、密码

  • algorithm:加密算法,比如aes192
  • 具体有哪些可选的算法,依赖于本地openssl的版本

可以通过openssl list-cipher-algorithms命令查看支持哪些算法

  • password:用来生成密钥(key)、初始化向量(IV)

crypto.createDecipher(algorithm, password)可以看作 crypto.createCipher(algorithm, password) 逆向操作

const crypto = require("crypto")

const SECRET = 'secret'
const ALGORITHM = 'aes192'
const content = 'Hello Node.js'
const encoding = 'hex'

// 加密
const cipher = crypto.createCipher(ALGORITHM, SECRET)
cipher.update(content)
const output = cipher.final(encoding)
console.log(output)
// 944e6e3c21d6eb8568bd6a9716631e、e

// 解密
const decipher = crypto.createDecipher(ALGORITHM, SECRET)
decipher.update(output, encoding)
const input = decipher.final('utf8')
console.log(input)

// Hello Node.js

「crypto.createCipheriv / crypto.createDecipheriv」

相对于 crypto.createCipher() 来说,crypto.createCipheriv() 需要提供keyiv,而 crypto.createCipher() 是根据用户提供的 password 算出来的

key、iv 可以是Buffer,也可以是utf8编码的字符串,这里需要关注的是它们的长度:

  • key:根据选择的算法有关

  • 比如 aes128、aes192、aes256,长度分别是128、192、256位(16、24、32字节)

  • iv:初始化向量,都是128位(16字节),也可以理解为密码盐的一种

const crypto = require("crypto")

const key = crypto.randomBytes(192 / 8)
const iv = crypto.randomBytes(128 / 8)
const algorithm = 'aes192'
const encoding = 'hex'

const encrypt = (text) => {
    const cipher = crypto.createCipheriv(algorithm, key, iv)
    cipher.update(text)
    return cipher.final(encoding)
}

const decrypt = (encrypted) => {
    const decipher = crypto.createDecipheriv(algorithm, key, iv)
    decipher.update(encrypted, encoding)
    return decipher.final('utf8')
}

const content = 'Hello Node.js'
const crypted = encrypt(content)
console.log(crypted)

// db75f3e9e78fba0401ca82527a0bbd62

const decrypted = decrypt(crypted)
console.log(decrypted)

// Hello Node.js

「数字签名」 「/ 签名校验」

  • 假设:

  • 服务端原始信息为M,摘要算法为Hash,Hash(M)得出的摘要是H

  • 公钥为Pub,私钥为Piv,非对称加密算法为Encrypt,非对称解密算法为Decrypt

  • Encrypt(H)得到的结果是S

  • 客户端拿到的信息为M1,利用Hash(M1)得出的结果是H1

  • 数字签名的产生、校验步骤分别如下:

  • 数字签名的产生步骤:

  • 利用摘要算法Hash算出M的摘要,即Hash(M) == H

  • 利用非对称加密算法对摘要进行加密Encrypt( H, Piv ),得到数字签名S

  • 数字签名的校验步骤:

  • 利用解密算法D对数字签名进行解密,即Decrypt(S) == H

  • 计算M1的摘要 Hash(M1) == H1,对比 H、H1,如果两者相同,则通过校验

私钥如何生成不是这里的重点,这里采用网上的服务来生成。

了解了数字签名产生、校验的原理后,相信下面的代码很容易理解:

const crypto = require('crypto');
const fs = require('fs');
const privateKey = fs.readFileSync('./private-key.pem');  // 私钥
const publicKey = fs.readFileSync('./public-key.pem');  // 公钥
const algorithm = 'RSA-SHA256';  // 加密算法 vs 摘要算法
const encoding = 'hex'

// 数字签名
function sign(text){
    const sign = crypto.createSign(algorithm);
    sign.update(text);
    return sign.sign(privateKey, encoding);
}

// 校验签名
function verify(oriContent, signature){
    const verifier = crypto.createVerify(algorithm);
    verifier.update(oriContent);
    return verifier.verify(publicKey, signature, encoding);
}

// 对内容进行签名
const content = 'hello world';
const signature = sign(content);
console.log(signature);

// 校验签名,如果通过,返回true
const verified = verify(content, signature);
console.log(verified);

DH(DiffieHellman)

DiffieHellman:Diffie–Hellman key exchange,缩写为D-H,是一种安全协议,常用于密钥交换,让通信双方在预先没有对方信息的情况下,通过不安全通信信道,创建一个密钥。这个密钥可以在后续的通信中,作为对称加密的密钥加密传递的信息。

  • 原理解析

假设客户端、服务端挑选两个素数a、p(都公开),然后

  • 客户端:选择自然数Xa,Ya = a^Xa mod p,并将Ya发送给服务端;
  • 服务端:选择自然数Xb,Yb = a^Xb mod p,并将Yb发送给客户端;
  • 客户端:计算 Ka = Yb^Xa mod p
  • 服务端:计算 Kb = Ya^Xb mod p

Ka = Yb^Xa mod p

= (a^Xb mod p)^Xa mod p

= a^(Xb * Xa) mod p

= (a^Xa mod p)^Xb mod p

= Ya^Xb mod p

= Kb

可以看到,尽管客户端、服务端彼此不知道对方的Xa、Xb,但算出了相等的secret

const crypto = require('crypto');

const primeLength = 1024;  // 素数p的长度
const generator = 5;  // 素数a

// 创建客户端的DH实例
const client = crypto.createDiffieHellman(primeLength, generator);
// 产生公、私钥对,Ya = a^Xa mod p
const clientKey = client.generateKeys();

// 创建服务端的DH实例,采用跟客户端相同的素数a、p
const server = crypto.createDiffieHellman(client.getPrime(), client.getGenerator());
// 产生公、私钥对,Yb = a^Xb mod p
const serverKey = server.generateKeys();

// 计算 Ka = Yb^Xa mod p
const clientSecret = client.computeSecret(server.getPublicKey());
// 计算 Kb = Ya^Xb mod p
const serverSecret = server.computeSecret(client.getPublicKey());

// 由于素数p是动态生成的,所以每次打印都不一样
// 但是 clientSecret === serverSecret
console.log(clientSecret.toString('hex'));
console.log(serverSecret.toString('hex'));
// 39edfedad4f1be731977436936ca844e50ebc90953ad208c71d7f2dc1772409962ec3eb90eaf99db5948f089e1d4951f148bd7ff76c18b53ff6be32f267fc54535928ce4acf15d923cfd0caec45db95b206e7636128210ea6813a20fb09cbfb06214b2f488716fea32788023d98cb4cb7fe39b68bd3563b3b34257e37f6b7fb7

// 39edfedad4f1be731977436936ca844e50ebc90953ad208c71d7f2dc1772409962ec3eb90eaf99db5948f089e1d4951f148bd7ff76c18b53ff6be32f267fc54535928ce4acf15d923cfd0caec45db95b206e7636128210ea6813a20fb09cbfb06214b2f488716fea32788023d98cb4cb7fe39b68bd3563b3b34257e37f6b7fb7

ECDH(Elliptic Curve Diffie-Hellma)

ECDH和DH原理类似,都是安全密钥协商协议。

相对于DH协议,结合椭圆曲线密码学ECC加速,运算更节省CPU资源

  • ECDH(「Elliptic Curve Diffie-Hellman」 )原理如下

img

const crypto = require('crypto');

const G = 'secp521r1';
const encoding = 'hex'

const server = crypto.createECDH(G);
const serverKey = server.generateKeys();

const client = crypto.createECDH(G);
const clientKey = client.generateKeys();

const serverSecret = server.computeSecret(clientKey);
const clientSecret = client.computeSecret(serverKey);

console.log(serverSecret.toString(encoding));
console.log(clientSecret.toString(encoding));
// 01c418be1b479f936397d4c1653ad77fa28fade67ff058dc18264a72bd1fc208ea6cac4dad996fda55bf271e84f0faef085173257b67bf21f95b09acee4d0a204517

// 01c418be1b479f936397d4c1653ad77fa28fade67ff058dc18264a72bd1fc208ea6cac4dad996fda55bf271e84f0faef085173257b67bf21f95b09acee4d0a204517

ECDHE(Elliptic Curve Diffie-Hellma Ephemeral)

普通的ECDH算法也存在一定缺陷,比如密钥协商的时候有一方的私钥总是一样的,一般都是Server方固定,Client方私钥随机生成。随着时间的延长,黑客可以截获到海量的密钥协商过程(有些数据是公开的),黑客就可以依据这些数据暴力破解出Server的私钥,然后就可以计算出会话密钥了,加密的数据也会随之被破解。固定一方的私钥会有被破解的风险,那么就让双方的私钥在每次密钥交换通信时,都是随机生成的、临时的,这个算法就是ECDH的增强版:ECDHE, E 全称是 Ephemeral(临时性的)。

扩展

学习这块儿知识的同时也学习了很多密码学相关知识,发现越挖越深快陷进去了,感兴趣的同学可以继续展开看看相关加密算法和他们之间的区别以及应用场景,例如:

  • 非对称加密DSA、RSA、DH、DHE、ECDHE
  • 对称加密AES、DES

几幅图,拿下 HTTPS (qq.com)

[https://mp.weixin.qq.com/s/U9SRLE7jZTB6lUZ6c8gTKg]

图解 ECDHE 密钥交换算法 - 小林coding

[https://www.cnblogs.com/xiaolincoding/p/14318338.html]

资料加密标准(DES) - 维基百科

[https://zh.wikipedia.org/wiki/資料加密標準]

高级加密标准 - 维基百科,自由的百科全书 (wikipedia.org)

[https://zh.wikipedia.org/wiki/高级加密标准]

「相关术语」

SPKAC:Signed Public Key and Challenge

MD5:Message-Digest Algorithm 5,信息-摘要算法。

SHA:Secure Hash Algorithm,安全散列算法。

HMAC:Hash-based Message Authentication Code,密钥相关的哈希运算消息认证码。

对称加密:比如AES、DES

非对称加密:比如RSA、DSA

AES:Advanced Encryption Standard(高级加密标准),密钥长度可以是128、192和256位。

DES:Data Encryption Standard,数据加密标准,对称密钥加密算法(现在认为不安全)。

DiffieHellman:Diffie–Hellman key exchange,缩写为D-H,是一种安全协议,让通信双方在预先没有对方信息的情况下,通过不安全通信信道,创建一个密钥。这个密钥可以在后续的通信中,作为对称加密的密钥加密传递的信息。(备注,是使用协议的发明者命名)

「密钥交换算法」

常见的密钥交换算法有 RSA,ECDHE,DH,DHE 等算法。它们的特性如下:

  • RSA:算法实现简单,诞生于 1977 年,历史悠久,经过了长时间的破解测试,安全性高。缺点就是需要比较大的素数(目前常用的是 2048 位)来保证安全强度,很消耗 CPU 运算资源。RSA 是目前唯一一个既能用于密钥交换又能用于证书签名的算法。
  • DH:diffie-hellman 密钥交换算法,诞生时间比较早(1977 年),但是 1999 年才公开。缺点是比较消耗 CPU 性能。
  • ECDHE:使用椭圆曲线(ECC)的 DH 算法,优点是能用较小的素数(256 位)实现 RSA 相同的安全等级。缺点是算法实现复杂,用于密钥交换的历史不长,没有经过长时间的安全攻击测试。
  • ECDH:不支持 PFS,安全性低,同时无法实现 false start。
  • DHE:不支持 ECC。非常消耗 CPU 资源 。

建议优先支持 RSA 和 ECDH_RSA 密钥交换算法。原因是:

  • ECDHE 支持 ECC 加速,计算速度更快。支持 PFS,更加安全。支持 false start,用户访问速度更快。
  • 目前还有至少 20% 以上的客户端不支持 ECDHE,我们推荐使用 RSA 而不是 DH 或者 DHE,因为 DH 系列算法非常消耗 CPU(相当于要做两次 RSA 计算)

本文由哈喽比特于2年以前收录,如有侵权请联系我们。
文章来源:https://mp.weixin.qq.com/s/fL_rp50qHsHEixRbH2GItQ

 相关推荐

刘强东夫妇:“移民美国”传言被驳斥

京东创始人刘强东和其妻子章泽天最近成为了互联网舆论关注的焦点。有关他们“移民美国”和在美国购买豪宅的传言在互联网上广泛传播。然而,京东官方通过微博发言人发布的消息澄清了这些传言,称这些言论纯属虚假信息和蓄意捏造。

发布于:1年以前  |  808次阅读  |  详细内容 »

博主曝三大运营商,将集体采购百万台华为Mate60系列

日前,据博主“@超能数码君老周”爆料,国内三大运营商中国移动、中国电信和中国联通预计将集体采购百万台规模的华为Mate60系列手机。

发布于:1年以前  |  770次阅读  |  详细内容 »

ASML CEO警告:出口管制不是可行做法,不要“逼迫中国大陆创新”

据报道,荷兰半导体设备公司ASML正看到美国对华遏制政策的负面影响。阿斯麦(ASML)CEO彼得·温宁克在一档电视节目中分享了他对中国大陆问题以及该公司面临的出口管制和保护主义的看法。彼得曾在多个场合表达了他对出口管制以及中荷经济关系的担忧。

发布于:1年以前  |  756次阅读  |  详细内容 »

抖音中长视频App青桃更名抖音精选,字节再发力对抗B站

今年早些时候,抖音悄然上线了一款名为“青桃”的 App,Slogan 为“看见你的热爱”,根据应用介绍可知,“青桃”是一个属于年轻人的兴趣知识视频平台,由抖音官方出品的中长视频关联版本,整体风格有些类似B站。

发布于:1年以前  |  648次阅读  |  详细内容 »

威马CDO:中国每百户家庭仅17户有车

日前,威马汽车首席数据官梅松林转发了一份“世界各国地区拥车率排行榜”,同时,他发文表示:中国汽车普及率低于非洲国家尼日利亚,每百户家庭仅17户有车。意大利世界排名第一,每十户中九户有车。

发布于:1年以前  |  589次阅读  |  详细内容 »

研究发现维生素 C 等抗氧化剂会刺激癌症生长和转移

近日,一项新的研究发现,维生素 C 和 E 等抗氧化剂会激活一种机制,刺激癌症肿瘤中新血管的生长,帮助它们生长和扩散。

发布于:1年以前  |  449次阅读  |  详细内容 »

苹果据称正引入3D打印技术,用以生产智能手表的钢质底盘

据媒体援引消息人士报道,苹果公司正在测试使用3D打印技术来生产其智能手表的钢质底盘。消息传出后,3D系统一度大涨超10%,不过截至周三收盘,该股涨幅回落至2%以内。

发布于:1年以前  |  446次阅读  |  详细内容 »

千万级抖音网红秀才账号被封禁

9月2日,坐拥千万粉丝的网红主播“秀才”账号被封禁,在社交媒体平台上引发热议。平台相关负责人表示,“秀才”账号违反平台相关规定,已封禁。据知情人士透露,秀才近期被举报存在违法行为,这可能是他被封禁的部分原因。据悉,“秀才”年龄39岁,是安徽省亳州市蒙城县人,抖音网红,粉丝数量超1200万。他曾被称为“中老年...

发布于:1年以前  |  445次阅读  |  详细内容 »

亚马逊股东起诉公司和贝索斯,称其在购买卫星发射服务时忽视了 SpaceX

9月3日消息,亚马逊的一些股东,包括持有该公司股票的一家养老基金,日前对亚马逊、其创始人贝索斯和其董事会提起诉讼,指控他们在为 Project Kuiper 卫星星座项目购买发射服务时“违反了信义义务”。

发布于:1年以前  |  444次阅读  |  详细内容 »

苹果上线AppsbyApple网站,以推广自家应用程序

据消息,为推广自家应用,苹果现推出了一个名为“Apps by Apple”的网站,展示了苹果为旗下产品(如 iPhone、iPad、Apple Watch、Mac 和 Apple TV)开发的各种应用程序。

发布于:1年以前  |  442次阅读  |  详细内容 »

特斯拉美国降价引发投资者不满:“这是短期麻醉剂”

特斯拉本周在美国大幅下调Model S和X售价,引发了该公司一些最坚定支持者的不满。知名特斯拉多头、未来基金(Future Fund)管理合伙人加里·布莱克发帖称,降价是一种“短期麻醉剂”,会让潜在客户等待进一步降价。

发布于:1年以前  |  441次阅读  |  详细内容 »

光刻机巨头阿斯麦:拿到许可,继续对华出口

据外媒9月2日报道,荷兰半导体设备制造商阿斯麦称,尽管荷兰政府颁布的半导体设备出口管制新规9月正式生效,但该公司已获得在2023年底以前向中国运送受限制芯片制造机器的许可。

发布于:1年以前  |  437次阅读  |  详细内容 »

马斯克与库克首次隔空合作:为苹果提供卫星服务

近日,根据美国证券交易委员会的文件显示,苹果卫星服务提供商 Globalstar 近期向马斯克旗下的 SpaceX 支付 6400 万美元(约 4.65 亿元人民币)。用于在 2023-2025 年期间,发射卫星,进一步扩展苹果 iPhone 系列的 SOS 卫星服务。

发布于:1年以前  |  430次阅读  |  详细内容 »

𝕏(推特)调整隐私政策,可拿用户发布的信息训练 AI 模型

据报道,马斯克旗下社交平台𝕏(推特)日前调整了隐私政策,允许 𝕏 使用用户发布的信息来训练其人工智能(AI)模型。新的隐私政策将于 9 月 29 日生效。新政策规定,𝕏可能会使用所收集到的平台信息和公开可用的信息,来帮助训练 𝕏 的机器学习或人工智能模型。

发布于:1年以前  |  428次阅读  |  详细内容 »

荣耀CEO谈华为手机回归:替老同事们高兴,对行业也是好事

9月2日,荣耀CEO赵明在采访中谈及华为手机回归时表示,替老同事们高兴,觉得手机行业,由于华为的回归,让竞争充满了更多的可能性和更多的魅力,对行业来说也是件好事。

发布于:1年以前  |  423次阅读  |  详细内容 »

AI操控无人机能力超越人类冠军

《自然》30日发表的一篇论文报道了一个名为Swift的人工智能(AI)系统,该系统驾驶无人机的能力可在真实世界中一对一冠军赛里战胜人类对手。

发布于:1年以前  |  423次阅读  |  详细内容 »

AI生成的蘑菇科普书存在可致命错误

近日,非营利组织纽约真菌学会(NYMS)发出警告,表示亚马逊为代表的电商平台上,充斥着各种AI生成的蘑菇觅食科普书籍,其中存在诸多错误。

发布于:1年以前  |  420次阅读  |  详细内容 »

社交媒体平台𝕏计划收集用户生物识别数据与工作教育经历

社交媒体平台𝕏(原推特)新隐私政策提到:“在您同意的情况下,我们可能出于安全、安保和身份识别目的收集和使用您的生物识别信息。”

发布于:1年以前  |  411次阅读  |  详细内容 »

国产扫地机器人热销欧洲,国产割草机器人抢占欧洲草坪

2023年德国柏林消费电子展上,各大企业都带来了最新的理念和产品,而高端化、本土化的中国产品正在不断吸引欧洲等国际市场的目光。

发布于:1年以前  |  406次阅读  |  详细内容 »

罗永浩吐槽iPhone15和14不会有区别,除了序列号变了

罗永浩日前在直播中吐槽苹果即将推出的 iPhone 新品,具体内容为:“以我对我‘子公司’的了解,我认为 iPhone 15 跟 iPhone 14 不会有什么区别的,除了序(列)号变了,这个‘不要脸’的东西,这个‘臭厨子’。

发布于:1年以前  |  398次阅读  |  详细内容 »
 相关文章
Android插件化方案 5年以前  |  237229次阅读
vscode超好用的代码书签插件Bookmarks 2年以前  |  8063次阅读
 目录