返回
小程序云开发如何检测过滤敏感词(上)
前端
2023-09-27 00:18:07
小程序与敏感词过滤的必然性
对于任何需要内容安全的互联网服务来说,无论是移动端的即时通讯,还是互联网上的论坛软件,面对数量庞大的用户生产的内容,都需要进行严格的过滤和筛选,以保证内容的合法与合规.
当您的服务发生违法违规事件时,对于您的账号,或整个产品来说都是极大的挑战. 轻则短暂性不可访问,重则永久封号,甚至关小黑屋.
在互联网飞速发展的今天,内容合规已经成为所有互联网从业人员都需要面对的重要问题,本文也将为大家详细介绍如何通过云开发的方式,对用户的聊天记录进行敏感词过滤,以保障内容的安全合规.
敏感词检测的策略
敏感词检测,一般有两种策略:
- 白名单: 在内容审核之前,已经有一个非常齐全的敏感词库. 任何包含这些敏感词的内容,将会被直接拒绝. 这是一种非常直接的方法,但是对新词的反应比较慢.
- 黑名单: 所有新内容先通过审核,只有检测到包含敏感词后,才予以拒绝. 这样做的好处是新词也可以检测到,但同时内容审核也会带来较大的性能开销.
小程序云开发平台,采用的是黑名单的方法,所以成本比较小.
实现敏感词检测
引入SDK
package main
import (
"context"
"fmt"
"log"
"os"
kms "cloud.google.com/go/kms/apiv1"
kmspb "google.golang.org/genproto/googleapis/cloud/kms/v1"
)
实例化客户端
// createClient creates a new KMS client based on the environment variables
// defined in `init`.
func createClient(ctx context.Context) (*kms.KeyManagementClient, error) {
// Create the client.
client, err := kms.NewKeyManagementClient(ctx)
if err != nil {
return nil, fmt.Errorf("failed to create kms client: %v", err)
}
return client, nil
}
加密机密
// encrypt encrypts plaintext using the Cloud KMS key named `keyRingID/keyID`.
func encrypt(w io.Writer, name string, plaintext []byte) ([]byte, error) {
// Create the client.
ctx := context.Background()
client, err := createClient(ctx)
if err != nil {
return nil, fmt.Errorf("failed to create kms client: %v", err)
}
defer client.Close()
// Build the request.
req := &kmspb.EncryptRequest{
Name: name,
Plaintext: plaintext,
}
// Call the API.
result, err := client.Encrypt(ctx, req)
if err != nil {
return nil, fmt.Errorf("failed to encrypt: %v", err)
}
fmt.Fprintf(w, "Ciphertext: %s\n", result.Ciphertext)
return result.Ciphertext, nil
}
解密机密
// decrypt decrypts ciphertext using the Cloud KMS key named `keyRingID/keyID`.
func decrypt(w io.Writer, name string, ciphertext []byte) ([]byte, error) {
// Create the client.
ctx := context.Background()
client, err := createClient(ctx)
if err != nil {
return nil, fmt.Errorf("failed to create kms client: %v", err)
}
defer client.Close()
// Build the request.
req := &kmspb.DecryptRequest{
Name: name,
Ciphertext: ciphertext,
}
// Call the API.
result, err := client.Decrypt(ctx, req)
if err != nil {
return nil, fmt.Errorf("failed to decrypt: %v", err)
}
fmt.Fprintf(w, "Plaintext: %s\n", result.Plaintext)
return result.Plaintext, nil
}
使用示例
func main() {
ctx := context.Background()
name := "projects/my-project/locations/us-east1/keyRings/my-key-ring/cryptoKeys/my-key"
plaintext := []byte("Plaintext to encrypt")
// Encrypt.
ciphertext, err := encrypt(os.Stdout, name, plaintext)
if err != nil {
log.Fatal(err)
}
// Decrypt.
plaintext, err = decrypt(os.Stdout, name, ciphertext)
if err != nil {
log.Fatal(err)
}
// Compare plaintext before and after encryption.
if !bytes.Equal(plaintext, plaintext) {
log.Fatalf("Plaintext and decrypted plaintext do not match")
}
}