You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python实现地理坐标匿名化及CSV数据脱敏方案咨询

CSV Anonymization: Hashing Names & Blurring Coordinates Irreversibly

Got it, let's walk through how to solve this CSV anonymization task properly. I'll share a practical Python-based solution that hits all your requirements—hashing names, blurring coordinates within a 2km radius irreversibly, and outputting the cleaned CSV.

Step 1: Set Up Dependencies

First, install the required libraries (we'll use pandas for CSV handling, numpy for geospatial calculations, and hashlib for secure hashing):

pip install pandas numpy

Step 2: Core Anonymization Functions

We'll build two key functions: one for hashing names securely, and another for randomizing coordinates within a 2km radius.

Secure Name Hashing

We'll use SHA-256 with a salt to prevent reverse-engineering via rainbow tables. You can use a fixed salt for consistent hashes across runs, or generate a random salt per entry for maximum security.

import hashlib
import os

def hash_name(name, salt=None):
    # Generate a random 16-byte salt if none is provided
    if salt is None:
        salt = os.urandom(16)
    # Combine salt and name, then hash
    hashed_bytes = hashlib.sha256(salt + name.encode('utf-8')).digest()
    # Return salt + hash (hex-encoded for readability)
    # Omit the salt from the return if you don't need to verify hashes later
    return f"{salt.hex()}:{hashed_bytes.hex()}"

Irreversible Coordinate Blurring

This function calculates a random point within 2km of the original coordinate using spherical geometry (critical for accuracy, even over small distances). Since we use random distance and angle, there's no way to reverse-engineer the original coordinates.

import numpy as np

def randomize_coords(lat, lon, radius_km=2):
    EARTH_RADIUS_KM = 6371.0
    
    # Convert degrees to radians for trigonometric calculations
    lat_rad = np.radians(lat)
    lon_rad = np.radians(lon)
    
    # Generate random distance (0 to 2km) and angle (0 to 360 degrees)
    random_distance = np.random.uniform(0, radius_km)
    random_angle = np.random.uniform(0, 2 * np.pi)
    
    # Calculate new latitude and longitude using spherical trigonometry
    new_lat_rad = np.arcsin(
        np.sin(lat_rad) * np.cos(random_distance / EARTH_RADIUS_KM) +
        np.cos(lat_rad) * np.sin(random_distance / EARTH_RADIUS_KM) * np.cos(random_angle)
    )
    new_lon_rad = lon_rad + np.arctan2(
        np.sin(random_angle) * np.sin(random_distance / EARTH_RADIUS_KM) * np.cos(lat_rad),
        np.cos(random_distance / EARTH_RADIUS_KM) - np.sin(lat_rad) * np.sin(new_lat_rad)
    )
    
    # Convert back to degrees
    return np.degrees(new_lat_rad), np.degrees(new_lon_rad)

Step 3: Full Pipeline to Process Your CSV

This script reads your input CSV, applies both anonymization steps, and saves the output. Adjust column names and file paths to match your data.

import pandas as pd

def anonymize_transaction_csv(input_file, output_file, 
                              name_col='姓名', lat_col='纬度', lon_col='经度',
                              fixed_salt=None):
    # Load the original CSV
    df = pd.read_csv(input_file)
    
    # Hash all names
    if fixed_salt is not None:
        # Convert fixed salt from hex string to bytes if provided
        fixed_salt = bytes.fromhex(fixed_salt)
    df['匿名姓名'] = df[name_col].apply(lambda x: hash_name(x, salt=fixed_salt))
    
    # Randomize coordinates for each row
    df[['模糊纬度', '模糊经度']] = df.apply(
        lambda row: pd.Series(randomize_coords(row[lat_col], row[lon_col])),
        axis=1
    )
    
    # Optional: Drop original columns if you don't need them for verification
    # df = df.drop([name_col, lat_col, lon_col], axis=1)
    
    # Save the anonymized CSV
    df.to_csv(output_file, index=False, encoding='utf-8')
    print(f"Success! Anonymized CSV saved to {output_file}")

# Example usage
if __name__ == "__main__":
    anonymize_transaction_csv(
        input_file='your_input.csv',
        output_file='anonymized_output.csv',
        name_col='姓名',
        lat_col='纬度',
        lon_col='经度'
        # Uncomment below to use a fixed salt (replace with your own hex string)
        # fixed_salt='a1b2c3d4e5f6a7b8c9d0e1f2a3b4c5d6'
    )

Critical Notes for Compliance & Security

  • Irreversibility: Both the salted hashing and coordinate randomization are designed to be irreversible. There's no formula or method to recover the original name or exact coordinates from the anonymized data.
  • Salted Hashing: Using a salt prevents attackers from using precomputed rainbow tables to reverse the hashed names. If you don't need to verify hashes later, you can modify the hash_name function to return only the hashed value (omitting the salt).
  • Coordinate Accuracy: The spherical geometry calculation ensures the blurred point is truly within 2km of the original, even near the poles or equator (a planar approximation would be less accurate here).

内容的提问来源于stack exchange,提问作者Gal Chen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 11:33:27